{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "orig_nbformat": 2,
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "colab": {
      "name": "qosf_screening_task_1.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "PQ8lBoUTVxt9",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "!nvidia-smi"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DPDkcl_lVet9",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "!pip install qiskit[visualization]\n",
        "!pip install qiskit-aer-gpu\n",
        "!pip install git+https://github.com/qiskit-community/qiskit-textbook.git#subdirectory=qiskit-textbook-src"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KqFxq-LpHBlo",
        "colab_type": "text"
      },
      "source": [
        "### Task 1 \n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "B3334lC_HBls",
        "colab_type": "code",
        "tags": [],
        "colab": {}
      },
      "source": [
        "import numpy as np\n",
        "\n",
        "from qiskit import QuantumCircuit, Aer, execute, QuantumRegister \n",
        "from qiskit.circuit import ParameterVector, Parameter\n",
        "from qiskit.compiler import transpile\n",
        "from qiskit_textbook.tools import array_to_latex"
      ],
      "execution_count": 28,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cKwMTSCQlCUj",
        "colab_type": "text"
      },
      "source": [
        "We plan to implement the following quantum circuit. Where the combination of 1 yellow block and 1 green block represents a layer. \n",
        "\n",
        "\n",
        "![img1.jpg]()"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "me7aMEIxHBmF",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "num_qubits = 4\n",
        "theta = ParameterVector('theta', length=num_qubits)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "POZL7sbxmZlK",
        "colab_type": "text"
      },
      "source": [
        "All the odd blocks can be decomposed as:\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qYdpgWaKmFn5",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 231
        },
        "outputId": "5d229540-255e-4c45-d7d2-f0a20f3c7b2b"
      },
      "source": [
        "qc = QuantumCircuit(4)\n",
        "for i in range(num_qubits):\n",
        "    qc.rx(theta[i], i)\n",
        "qc.draw('mpl')"
      ],
      "execution_count": 29,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 200.977x264.88 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 29
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-mMnMEJHl6JW",
        "colab_type": "text"
      },
      "source": [
        "All the even blocks can be decomposed as: \n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eIdyS5Ikmc0J",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 231
        },
        "outputId": "bc10a3f6-4538-4571-9f84-44d784aae6f0"
      },
      "source": [
        "qc = QuantumCircuit(4)\n",
        "for i in range(num_qubits):\n",
        "    qc.rz(theta[i], i)\n",
        "qc.cz(0, 1)\n",
        "qc.cz(0, 2)\n",
        "qc.cz(0, 3)\n",
        "qc.cz(1, 2)\n",
        "\n",
        "qc.draw('mpl')"
      ],
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 441.777x264.88 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 31
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2B1iGShAm5Iq",
        "colab_type": "text"
      },
      "source": [
        "$ \\left| \\phi \\right\\rangle $ is a randomly generated vector on 4 qubits.\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "V9mqpKEvHBmP",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 343
        },
        "outputId": "d27d6167-e894-4ded-fd89-5e8a717af299"
      },
      "source": [
        "phi_state = np.exp(1j*np.random.rand(num_qubits**2))\n",
        "array_to_latex(phi_state, pretext=\"|\\phi 〉 = \")"
      ],
      "execution_count": 58,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/latex": "$$\n|\\phi 〉 = \\begin{bmatrix}\n0.81265 + 0.58276i \\\\\n0.99987 + 0.01636i \\\\\n0.88951 + 0.45692i \\\\\n0.91258 + 0.40889i \\\\\n0.59175 + 0.80612i \\\\\n0.90799 + 0.41898i \\\\\n0.91628 + 0.40054i \\\\\n0.90401 + 0.42751i \\\\\n0.62919 + 0.77725i \\\\\n0.7035 + 0.7107i \\\\\n0.74576 + 0.66622i \\\\\n0.99845 + 0.05559i \\\\\n0.94703 + 0.32114i \\\\\n0.65982 + 0.75142i \\\\\n0.60506 + 0.79618i \\\\\n0.54688 + 0.83721i\n\\end{bmatrix}\n$$",
            "text/plain": [
              "<IPython.core.display.Math object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "t6fUt2d7pl8p",
        "colab_type": "text"
      },
      "source": [
        "Let us define a Unitary Gateset which constitutes of an odd and an even unitary gate as shown below. A single gateset would act as a layer in our circuit."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "tags": [],
        "id": "xCAjjxhjHBma",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 231
        },
        "outputId": "22ef39b3-baaa-4aaf-eb59-6077edd15204"
      },
      "source": [
        "U_reg = QuantumRegister(num_qubits)\n",
        "U_gateset = QuantumCircuit(U_reg, name='U_gateset')\n",
        "\n",
        "for i in range(num_qubits):\n",
        "    U_gateset.rx(theta[i], i)\n",
        "U_gateset.barrier()\n",
        "\n",
        "for i in range(num_qubits):\n",
        "    U_gateset.rz(theta[i], i)\n",
        "U_gateset.cz(0, 1)\n",
        "U_gateset.cz(0, 2)\n",
        "U_gateset.cz(0, 3)\n",
        "U_gateset.cz(1, 2)\n",
        "U_gateset.barrier()\n",
        "\n",
        "U_gateset.draw('mpl')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 635.358x264.88 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 9
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "k8CSoVRap35A",
        "colab_type": "text"
      },
      "source": [
        "Compiling a parametrized circuit prior to parameter binding can help in reducing the compilation time of the circuit."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OaEVdIXZVdTR",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "statevector_backend = Aer.get_backend('statevector_simulator')\n",
        "transpiled_qc = transpile(U_gateset, backend=statevector_backend)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "W3j7CNw7qqLp",
        "colab_type": "text"
      },
      "source": [
        "We employ an evolutionary algorithm to optimize the parameter values in the quantum circuit in order to minimize the distance between the final state $ \\left| \\psi(\\theta) \\right\\rangle $ and a randomly generated state $ \\left| \\phi \\right\\rangle $. "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "i0t_AEuZruLj",
        "colab_type": "text"
      },
      "source": [
        "An evolutionary algorithm intially selects a random set of parameters as shown below."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "911fZhBPHBnZ",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 289
        },
        "outputId": "87514a51-4af8-43cd-9b20-666da94d9960"
      },
      "source": [
        "def init_pop(sol_per_pop, L):\n",
        "  \"\"\"Initalizes a random population of parameters\"\"\"\n",
        "  population = []\n",
        "  for i in range(sol_per_pop):\n",
        "    population.append(2*np.pi*np.random.rand(4*L))\n",
        "  return population\n",
        "\n",
        "pop0 = init_pop(8, 2)\n",
        "pop0"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[array([0.85441479, 2.91687285, 5.17607191, 3.15014447, 2.93562011,\n",
              "        0.95203069, 4.45243956, 3.84725297]),\n",
              " array([0.64943943, 0.72646726, 2.07725365, 6.17145479, 3.34322777,\n",
              "        4.5609759 , 1.45695532, 5.20937418]),\n",
              " array([5.6752203 , 4.38728645, 4.1506588 , 3.68274813, 3.19147104,\n",
              "        1.27238481, 0.43296692, 0.4965026 ]),\n",
              " array([1.50795239, 3.97870036, 6.24322132, 5.85318065, 1.40703925,\n",
              "        1.77123763, 2.7385268 , 1.53891935]),\n",
              " array([5.62654566, 3.42145072, 0.2656722 , 3.43174723, 5.65061174,\n",
              "        1.17010675, 4.88129745, 3.5532673 ]),\n",
              " array([0.52795316, 0.81194667, 6.25962102, 4.89691905, 1.96256235,\n",
              "        3.24273847, 4.33464594, 4.77592117]),\n",
              " array([1.80866742, 2.81696801, 2.78939554, 4.19824644, 2.51225674,\n",
              "        3.35639878, 1.69049218, 5.53032165]),\n",
              " array([1.28713727, 3.98279788, 0.3576358 , 4.45585485, 3.90527631,\n",
              "        0.42383009, 3.7897873 , 1.54452234])]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 11
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SUYUR0xvuw3P",
        "colab_type": "text"
      },
      "source": [
        "The below function is used to generate a quantum circuit of $L$ layers and bind the parameters provided in the argument to those in the circuit.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JEi-isEvVdTt",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 231
        },
        "outputId": "0cfc8473-32c4-43fe-911b-c8d02ea34683"
      },
      "source": [
        "def generate_qc(L, params):\n",
        "  \"\"\" Generates a Quantum Circuit with L-layers and binds the parameters with those in the argument\"\"\"\n",
        "    params_split = np.split(params, L)\n",
        "    u_layers = [transpiled_qc.bind_parameters({theta: param}) for param in params_split]\n",
        "\n",
        "    qr = QuantumRegister(num_qubits)\n",
        "    qc = QuantumCircuit(qr)\n",
        "\n",
        "    for i in range(L):\n",
        "        qc.append(u_layers[i].to_instruction(), qr)\n",
        "\n",
        "    return qc\n",
        "\n",
        "qc = generate_qc(2, pop0[0])\n",
        "\n",
        "qc.decompose().draw('mpl')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7QAAADWCAYAAADhE85iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXhU5fn/8ffMJCRhDRD2JUACJMEEAdEgElYLilbKT9ksKtBKEVxobb9oReCLptRScSlqa1VaF/gColYFLVuCKIuACmGRJWxBlrAEyELIMr8/RgIxk8lAZnLOmXxe15VLPHN4cs+ch/uee+ac59icTqcTEREREREREYuxGx2AiIiIiIiIyLVQQysiIiIiIiKWpIZWRERERERELEkNrYiIiIiIiFiSGloRERERERGxJDW0IiIiIiIiYklqaEVERERERMSS1NCKiIiIiIiIJamhFREREREREUtSQysiIiIiIiKWpIZWRERERERELEkNrYiIiIiIiFiSGloRERERERGxJDW0IiIiIiIiYklqaEVERERERMSS1NCKiIiIiIiIJamhFREREREREUtSQysiIiIiIiKWpIZWRERERERELCnI6ABEzG7Xrl0V7vO3v/2NSZMmedwnJibGVyGJiIX4IocofwQu1RgRqQzVGH1DK+ITc+fONToEEbEw5RDxRPNDRCoj0HOIGloRERERERGxJDW0IiIiIiIiYklqaEV8YPHixUaHICIWphwinmh+iEhlBHoOUUMrIiIiIiIilqSGVsQH7r77bqNDEBELUw4RTzQ/RKQyAj2H6LY9FlX00WacP2QZHUaVszUPx3FXN6PDMA2j5oGOg0j1UR3qjXKae6oxImIFamgtyvlDFs70E0aHIQbTPBARf1Oeqb507EXECnTKsYgPTJw40egQRMTClEPEE80PEamMQM8hamhFfGDSpElGhyAiFqYcIp5ofohIZQR6DlFDK+IDSUlJRocgIhamHCKeaH6ISGUEeg5RQyviA5mZmUaHICIWphwinmh+iEhlBHoOUUMr5Wr/j0d4d8dar7eLOek4iogZKTcFBh1HETGaGloRH4iLizM6BBGxMOUQ8UTzQ0QqI9BziBpaER94//33jQ5BRCxMOUQ80fwQkcoI9Bxi6YY2JSUFm83m9ufChQtGhyfVyNNPP210CCJiYcoh4onmh4hURqDnEEs3tJfMnj2bdevWlfoJCQkxOqyAdzznLEnvTWPAgpn0fGcqqw6mGR2SYRYtWmR0CJUyaOGzNJ87nuR1HxgdikdOp9ERXBurxm1FVn2trZ5D/EE15jKrzw/VGP+yatxWZNXX2uo5pCJBRgfgCx07diQxMdHoMAJOsN1BYVFhme0FxUUE2x1EhNVh9YhpOOx20rOOc+/HL7Nu9DMGRCqeVHQcAf55229YdTCNjPOnqzq8CuUXwvq9sHY3nDwPQQ64riX0joE2EUZHV779mZCyC7YfgaIiaFQXbukAiVFQIyAyr3nsOgprdsH3x1xvNpqFQ68O0L0dOALiY9vApBoTGKxeYwqKYMM+V405fg4cNohtDkkx0L6J0dGV79ApV9777jAUFkHD2nBze9dPaLDR0QWWvcchdRfs/AGKnNDkx3p+UxQEO4yOTsDE39AWFxcze/Zs2rdvT2hoKJ07dyY1NZWOHTvy4IMPGh1etRBZrxF7s46X2pZ98QLHcrJoV68xDrsdh901hc7m5xLfqLURYUoFKjqOAC3rNDQitArlXoSX/gsfbHY1s05cbz6+PQgvfA5f7TE6QvfW7oYX/wtbD7neaDiBzHOwZBO8vBzyLhodYeBYthVeWwU7j0JRMRQ74YczsGADvJ7iev3FnFRjAoOVa0x+IbyyEhZ/DcfPuj4QKyyGtCMwdwWs3ml0hO59nQ5zPofNB1w10QmczIb/fOOqjdm66s5nVu+Ev62AtAzX3HA6XXNl8deuuZNf9rMcMYBpG9px48Yxc+ZMxo8fz7Jlyxg2bBgjR44kPT2dbt26ldp37NixBAUFUb9+fYYOHcquXbsMijqwjO6UxBtbV7E2YxdFxcWcuZDNb1f9m+siWnN9kzYA7M86QZ/50xm8eBZ3tb/B2IANlJqaanQI5fLmOJrVog1w5Izrz1ee5XPpzws3wmGTfeB/4KSr0IH7mA+fhve/ruqoAlNaBny+zfXnK08Du/THXUdh6XdVHtY1MXMO8RfVGO+ZeX5YucZ8uNl1Ng38JF//+D8fbYE9x8v8NUMdOwvvrXfF6O7s1+NnYf76Kg8rIO097poD4L6e7890zSErMHMO8QVTnvg2f/585s2bR0pKCr179wagb9++bNmyhSVLltC1a1cA6tWrx+TJk+nTpw/h4eGkpaWRnJxMYmIimzZtIjo62sinYXmj4m4hr/Aij6x4i0PnTlK7Rii9WsbywS8eJ+jH04jahjcmZeR00rOOM3DhswyO6mpw1MbYvn07jRs3NjoMt7w5jmaUlQvfHva8jw344nsY1aNKQvLKF9+74vJ0mc2Wg/DzrlA3rKqiCkwpuyp+rb/aC4MSzH+at5lziL+oxnjPzPPDqjUmJx82pnvex2Zz5XQznXq8drfn6ziduC51OXkeIupUWVgBaY0X9XxjOtx5PdQ0+dI9Zs4hvmDKEp+cnMygQYNKmtlLoqOjCQ4OJiEhAYAuXbrQpUuXkseTkpIYOHAg8fHxJCcn8+abbwJw4MAB7r//fo4ePUpISAivvPIKvXr18mnMNpvNp+NVZPnwp+jdyv/3lBqX0I9xCf3cPpZfWEBIkOtCjbo1wqgVHOr3eFJSU7j1oQF+/z1Xmjx5coX7zJkzp8L95syZ46uQSng7Dzwdx2tRFcchttd9/Gz8vzzu4wRSvj3BvTeb593G+L+fJrRWfY/7FDvhxv6j+H7d/CqKKvDYHcE8/K+Kz92+UABRCX3J2Jni/6DK4Ysc4o/84S1/1huz1BgjasslqjFlVcXxaNftLu6c/KHHfZxO2LIvj3G9a/o1lqvxwJx06jVqW+F+/Yc+xNYVr1ZBRIFr4pu5BNXw/MlzUTHE9xxC+uaPqiiqsqxeYzxxerkKl+ka2oyMDNLS0ty+6IcOHaJTp04eVzCOiooiMTGRDRs2lGwbP348w4cP56GHHuKrr77innvuYf/+/dSoUcMvz6G62HRsH1PXLsRhs1NQXMjz/e4zOiS5Rr/+7O9sPLqXi0WFbDy6lw+H/t7okLA7vPv36fByv6ricHi3Goc9yFxxW409yPtVT/RaW5NqTOAwY41xeJkXribXVAWv4/ayFkn5vH0NvT0m4j82p7etbxVZv349PXr04NNPP+X2228v2Z6Xl0dUVBS33XYbb7zxhscx+vbtS2ZmJmlpaZw8eZLIyEhOnz5d0gh3796dZ555hoEDB/r1ufhT4asrcaafMDqMKmdr15igCf2r9Hd6c012bGwsO3d6Xj0iJibGVyGVMGoeVMVx2J/pWljJYxw210rHj/7Mr6Fclec/g8OnPJ+iBPDbQdDanOukWILTCTM+dJ2aXpGn74IGtf0fU3l8kUP8kT+8VR3qjRG15RLVmLKq4ngczYI/f1pBHECTejDlDr+GclVeXQm7j1d8+5gJ/aBjs6qJKVDN+uTHxcIq2O9/BrtW1zeK1WuML5huUaiICNd9OHbv3l1q+3PPPcfRo0fLLAj1U3v27GHDhg3cdNNNgOtb3SZNmpT6Vrdt27YcPHjQx5FLdTZjxgyjQwg4bSKgaT3XG4ryOJ2upfPN5JYOnoufDWhRH1o1qKqIApPNVvGxtwFxzY1tZr2lHCKeaH74XrNwaBtRQY3BfDWmZwfPzawNaFgL2jetspACljf1vG2Esc2stwI9h5julON27dqRkJBAcnIyDRo0oEWLFixevJilS5cClGpoR40aRZs2bejWrRv169cnLS2NWbNmERYWxpNPPmnUU5BqaNiwYUaHEHBsNhh2I8xdCcXF7otKTDO43mR38ujWBjbth93Hyj5mw3Vf1HtudD0/qZxeHeCbg5dXwr6SzQahQXCXRdYQUg4RTzQ//OP/dYeXlkNBofsa07aR616jZnJdC4hvBdvcLJpow5X7hieCXTWm0m6Kgi0HID2z7GM2IMjhmkNWEOg5xHTf0NrtdhYtWkSnTp2YMGECY8aMISIigokTJ+JwOEoWhAJISEhg6dKljBs3joEDBzJr1iwGDBjAxo0biYpyZaDWrVtz/Phx8vPzS/7e/v37iYyMrPLnJoErNjbW6BACUrvGMGkAtPzJt5nBDkjqCL/q7WoQzcRhd8XVq4Or2F2pVUOYdKvr22epvJBgmDgAurct++YtqjE8OtB1uqAVKIeIJ5of/tGyATziJic77NAjGn7Tz1VvzMRuhwdugX6xZVdvbxYOE/pDB3076xPBDhjfD26OLvte49LlTj99f2JWgZ5DTPcNLUCHDh1YvXp1qW2jR48mLi6OsLDLq41NmTKFKVOmeBwrIiKCnj178sYbb5QsCnXkyBH69u3rl9ir0uOr32bzsXS6NGnD8/3uL9meW5DPyP+8SE5BPnVDajL/zkc4mpPFLe9OJaZBC2o4glh6zxMl+7+4aSkf7NlIysjpPovtyPnT/Obz1zl7MRe7zcYNTaOY3Xf0VY/x/NefMDz2Zh5f/bZrnI7X8aJB1zlZSXlzY/H363n+60+wYeN/Eu/i59E3MG7Za+w6dYSwoBqM69yPkbE9AdfKct3//SQPdfkZYxOM+/fSthH87jbIOA2zl7m2zfx/EGri9S5qBLk+tb29MzyxyLXt97e7TjUW36pZA+692fVN7FPvu7Y9cSc0qWtsXIFiw4YNPPaXR7BfLCyTxwuLi7j/07mcyD1Ht6btmNV7VMljlqorTaP4a7vf+SzO6mLj0b2lXsMrj8W3Jw7w6Ip52G02ZvYazi0tL1+fN/SDv3Jdo1b87y3m+MaoZQPXh19XXlP7v0Ohlolvw+Kwu279NjAe/meha9vvBrmei87+8a2QIBh2Ewy+Hv642LXN6GtmpSyTfbdRvk2bNlV4/Wx5XnvtNRYsWECHDh148MEHmT9/vuVXON5yaA/ZFy+weuQ0LhYVsunovpLHPt//Hd2bRbNixFS6N4vi8wPfAdA/Mp4VI6aWambzCwv47oTvrydeeXAbI+N68t9hfyRl5HRO5J5lW+ahqx6jf2Q8retGXB7nfBbbtm3zebyB5Jvj+8udGy9tXsaK4VNZMXwqL25aWrL9X4MnsmLE1JJmFuCTfVtoVNM8N7G78lNQMzezVwq7Is2omfWv2lfc0UXNrO9ERkay/LHZbvP4h3u+JqFxJMuHP8WFwosltcRydSX3LNuOVHBDUimjzGt4xbGY8eVi3r3zYT69ewqz1l++Nc7WzENcKKz4dltGuLJBMXMze6WQK2phq4ZqZv3pyjmhZtZ8LNHQZmdns3v3brp2vbaLodq1a8eaNWvYvXs3aWlpZe5va0Ub9u+gf2Q8AP0i41l/dE/JY+3Cm5BT4DrF+uyFHBqGulZEST28g77zZ5RqZN7alsLo65KuOY7UQzto/PKvGLBgJtF/f4ShH/wVgDWHd/Lz6BsI/XEp82B7EA6b++nmaYykVrE0rRV+eRxHEA6Hyc7/Afr06WN0CCU2/LC3wrmRXXCBOj/eW80GjF32KkOW/IWDZy9fKLJg55cMi+lRpbGLVFdmyiFXatq0KaHB7vP4/qwTxEe4LmLv3DiS9T+4FnM0Q10pbxy3dcUehMNuvrpyJTPOjzKv4RXHIutCDi3rNKRmcAg5BfnkFbia2LlbPmP89cbc71ekOjNjDvElSzS0tWvXpqioiIcfftjoUEzjbF4OdUNcDUm9kDCyLly+d0X7+k3ZcHQPnd/6PZuP76dHiw40qxXO9rF/Zfnwp1h1MI2tmYcoKCp0NbmtO11zHL1axdC9WRQrRkylV6sYXh4wBqfTSU5BPrVruL4y2Zp5iJO554iLaHnNY5SMcz6LuLiKb/Je1V591Tw3L8/KL39u3BV9Azf++0m6//sJJnZ13bbquT6/ZM2oGfz+xjv5Q8q7ACw/sJWkVrEe3yyKiO+YKYe44y6Pd2jQjDUZrttApBzaQVZ+rmnqSnnjuK0rueeIa2budTXMPD/cHYuImnVJyzxMZu45tp88TFZ+DrtOHSEirC7hIbUMjFakejJzDvEFvVu1qLphtTiXnwfAufw8wkNrljz29vY1DG7Xhe/G/IXb2l3PuzvWEhIUTK0aoQTZHdwe1YXtJw/z7o61jIi9ucLfdSwniwELZpb6uffjlwBIzzpB23qNAcg4f5oWdRrwXeZBEhq73hyczsvmsZXz+PugB8sdv6IxrhznH798/CpfqaoxYcIEo0MoUS+kZrlz49l1H/DdmOfYOuYvPLtuCQANwlzf4PdsGcPx3CwA3ty6mvuvs/6ZDCJWYaYc8lOnc865zeN3RHXjQuFFBi58lhBHME1q1jNNXXE3TmbeObd1paJxzMCs86O81/DZXiP4Q8o7TFz+BvGNWhMRVocXNy/l4W6DDIpUpHozaw7xFVMuCiUVS2wbx+tLF3FPTCKrDqZx3xWndzmdl5uUiLA6nMvP4/zFvJJTTL86spuJXQfywe6v2Zp5gNe/W8mOkxnM3fI5468fwKm8bJrUurw0aNNa4awYMdVtHDtOZRDXsCVFxcXYf7x4Y+WBbQyIvI7C4iIeWDqXP/ceRdNargsOCouLyozvaYxLf6dknHrmXE4uJSXF6BBKJDZvz+vfrXQ7N0IcQdQMDsGGjYtFhQCcy8+lbkhNvj/9Q8kn53vOHOPuD5/nSPYZnE4nN7foQEzDFoY8H5HqwEw55EqFhYXcP29WqTx+icNu54X+DwAw4b+vc2ubBP625XNT1BV345RbV2qZ/4I4M84PT69hhwbNWHrPE5zMPcfjKe8Q7Aji0LmT/GrZa5y+kM3pvGwGRMaT1CqwV14VMQsz5hBfUkNrUV1btyc0KJi+82fQuXEk3ZtFcywni7e2pTDh+lu595OXeHf7WoIdDt694xHWZuxi+peLCHEE07NFDDc2i+bGZtEl4/WZP52JXQey98wxZm/8mNcG/tqrOHaczCCxeXvyiwo4kXuOo9ln2Hx8P5O7D2bhrvVsOpbOE6nzAXgmaTgRYXXLjO9pDIDF32+4PM7Gxcy6/jV69NC1neXp0qRtqbnRqm4Ef1r/IU8kDmH89QPo/d50AH6V4Fot+r5P55KVn4MNGy8PGAvApvv/BMC/01IpLC5WMytSTS1atIhNB7/nibPnAVceb1OvMW9tS+G+Tknc/+lc7DYbv+zUixZ1GvCn3iNL/q6RdcXdOKsOpbmvK8AzIybQC62gfzXKvIZJw1mw8yte6P8Ab21bzXs7viQsKJgX+48B4NO7XQtSph7awcpDaWpmRcRnbE6n0929pMXkCl9diTP9hM/HXbJ7I/VDa1Xq+qdFu9ZzT0xipcYvbwxbu8YEVfFte3bt2lXhPrGxsezcudPjPjExMR4fvxb+mgcVMeI4ADzmusSXF+6t8l99zawYs1WZ9bX2RQ7xR/7wVmXzjNnrChiX00A1xh3VGO9ZMWarMutrbfUa4wv6hlZKGdrhxkqPUd4bhqsZ39MYZlTRGw0REU8COYeorlReIM8PEfG/QM8hWhRKxAcWLlxodAgiYmHKIeKJ5oeIVEag5xB9Q2tRtubmX8TCH8z6vKdNm8awYcOq/Pca9XqY9TiIWJVROcQb1eHfu9mfo2qMiFSGmWuML6ihtSjHXd2MDkFMQPNARPxNeab60rEXESvQKcciIiIiIiJiSWpoRXzglVdeMToEEbEw5RDxRPNDRCoj0HOIGloRH+jU6dpvRyEiohwinmh+iEhlBHoOUUMr4gO9e/c2OgQRsTDlEPFE80NEKiPQc4gaWhEREREREbEkNbQiIiIiIiJiSWpoRXyge/fuRocgIhamHCKeaH6ISGUEeg5RQyviA19//bXRIYiIhSmHiCeaHyJSGYGeQ9TQioiIiIiIiCWpoRURERERERFLUkMr4gOLFy82OgQRsTDlEPFE80NEKiPQc4gaWhEREREREbEkNbQiPnD33XcbHYKIWJhyiHii+SEilRHoOSTI6ACk8oo+2ozzhyyjw/ArW/NwHHd1MzoM0zHq2Ot4iAS26lBX3FFuK001RkSsQA1tAHD+kIUz/YTRYYgBdOxFxB+UWwQ0D0TEGnTKsYgPTJw40egQRMTClEPEE80PEamMQM8hamhFfGDSpElGhyAiFqYcIp5ofohIZQR6DlFDK+IDSUlJRocgIhamHCKeaH6ISGUEeg5RQyvlav+PR3h3x1qvt1dnmZmZRodQLh1HEfMzcw7xF+Um75l5fug4ipifmXOIL6ihFREREREREUtSQyviA3FxcUaHICIWphwinmh+iEhlBHoOUUMr4gPvv/++0SGIiIUph4gnmh8iUhmBnkMs3dCmpKRgs9nc/ly4cMHo8ALe8ZyzJL03jQELZtLznamsOphmdEiGefrpp40OoVIGLXyW5nPHk7zuA6NDEamWrJ5D/EE15jKrzw/VGBFjWT2HVMTSDe0ls2fPZt26daV+QkJCjA7L8oLtDgqLCstsLyguItjuICKsDqtHTGPFiKm8fcck/rhmgQFRmsOiRYuMDqFcFR1HgH/e9htm9R5V1aF5Lb8A1u+7/P+HThkXS6DLzYe1u+E/W+DzbXDsrNERVQ9mziH+ohrjPTPPj0CoMRcL4ev0y/+/PxOcTuPiCWQXCmDdXleN+WwrZJw2OqLqwcw5xBeCjA7AFzp27EhiYqLRYQScyHqN2Jt1vNS27IsXOJaTRbt6jXHYL38ecjY/l/hGras6RPFCRccRoGWdhkaE5pV1e+HDzZB/xful5z+DNhEwphfUq2lcbIHE6YSVO1xvMAqLL29fthVim8PonlCzhnHxSeBRjQkMVq8xWw7Awo2uRuuSF/8LLevDmCRoWNuw0ALOF9/Df76BgqLL2z7bBtGN4f5eUCfUuNjE2kz7DW1xcTGzZ8+mffv2hIaG0rlzZ1JTU+nYsSMPPvig0eFVC6M7JfHG1lWszdhFUXExZy5k89tV/+a6iNZc36QNAPuzTtBn/nQGL57FXe1vMDZgccub42hWm/bD/20o3cxecvAk/G1F6Tchcu1W74RPvi3dzF6y8wf4+2oocvOYyLVSjQkMVq4x2w7Dv790X0eOnIGXl0O2rmDzia/2wPubSjezl+w7Aa+sdH1TLnItTPsN7bhx41iyZAlTp06lW7dufPXVV4wcOZLMzEx++9vfltp37NixnD59mjp16tC3b1+Sk5OJiYkxKPLAMSruFvIKL/LIirc4dO4ktWuE0qtlLB/84nGCfjyNqG14Y1JGTic96zgDFz7L4KiuBkdtjNTUVKNDKJc3x9GMiorhoy3lP+4EMs/Dhn3QW//cK+VCgeubWE8OnnS9+bs+smpiqm7MnEP8RTXGe2aeH1atMU4nfPQN2HDVkzKPA1m5sHYPDIqv4uACTGGR6wPT8jiBo1mw+QD0iK6qqKoXM+cQXzBlQzt//nzmzZtHSkoKvXv3BqBv375s2bKFJUuW0LWrq6DVq1ePyZMn06dPH8LDw0lLSyM5OZnExEQ2bdpEdLT+VVTWuIR+jEvo5/ax/MICQoKCAahbI4xawdX3XJHt27fTuHFjo8Mol6fjaFbfH4XzFXwybsN1SrIa2sr59qD7T82vZLO5Xms1tP5h9hziL6ox3jH7/LBijdmfCSfPV7zf+r1qaCsr7QjkXvS8z6V6robWP8yeQyrLlA1tcnIygwYNKmlmL4mOjiY4OJiEhAQAunTpQpcuXUoeT0pKYuDAgcTHx5OcnMybb74JuFb2WrBgAXv37mXhwoXcfffdPo/ZZrP5fExvLR/+FL1bVf39pTYd28fUtQtx2OwUFBfyfL/7/Pa7UlJTuPWhAX4b35PJkydXuM+cOXMq3G/OnDm+CqmEr479rz/7OxuP7uViUSEbj+7lw6G/97h/VRyP6/o9SP+xf/e4jxM4eOwcNls9v8ZSGY++4/rs38gcUZGbhk4jceh0j/s4nbD+m+95aIB5Pz0w62vtixzij/zhiVF15UpVWWMuMaLWqMaUVRXHoUPicG6bVPFCY2dyirHZzPtNs1nz3pW6DHqMpF96np9OYGf6MWy2ZlUT1DUw62ttxRrjLaeXq7OZrqHNyMggLS3N7Yt+6NAhOnXq5HEF46ioKBITE9mwYUPJtkGDBvHAAw8wduxYv8RcXfVsGcOqEYG9DHh18fqg8UaHUMbF3IqX13U6nV7tJ5559VoXF5Ofc6YKohFxUY0JHGasMfle1o6LeV58jSseefNaO53F5Oeonsu1sTm9bX2ryPr16+nRoweffvopt99+e8n2vLw8oqKiuO2223jjjTc8jtG3b18yMzNJSyt9z7o+ffowadIkv3xDa6TCV1fiTD9hdBh+ZWvXmKAJ/Q353bt27apwn9jYWHbu3OlxH39c123Usa+K45F3EZ5eUvGpsP3i4OddPO9jpMfedf33hXuNjcOT09kw8yP315FdaUg36GPeL2hN+1r7IodU9boQ1aGuuGNErVGNKasqjkNBkavG5Hk4FdaG6xTYYTf5NZRKMWveu1L2BZj2QcULCw6Kh0EJVRPTtTDra23FGuNrplvlOCIiAoDdu3eX2v7cc89x9OhRunXr5vHv79mzhw0bNnDTTSbOPhJwZsyYYXQIASesBvTqWP7jNqBGENzSvspCClgNakO3NuU/brNB7RC4sW2VhVTtKIeIJ5ofvhfsgH6x5T9uA+x2SLL2+3xTqB0KN3u4NtZmg9Bg6KF67jeBnkNMd8pxu3btSEhIIDk5mQYNGtCiRQsWL17M0qVLAUo1tKNGjaJNmzZ069aN+vXrk5aWxqxZswgLC+PJJ5806ilINTRs2DCjQwhIgzvD2VzXyoc/XYmyRhD8uo+rGZPKG3YTZOfDrqOuNxdXnrtTqwZM6A81y7/aQypJOUQ80fzwj/6d4Eyu65YyP60xQQ7Xvc6bmneJBku5qyuczYOth8u+1qFBML4f1AszKrrAF+g5xHQNrd1uZ9GiRYwfP54JEybQsGFD7r//fiZOnMiTTz5ZsiAUQEJCAqDtNrcAACAASURBVAsWLOCVV14hJyeHRo0aMWDAAKZNm0ZUVJSBz0KqG29OB6tqG4/u5fHVb2O32bihaRSz+44ueezbEwd4dMU87DYbM3sN55aWMfzzu5XMS3Mt6z6x60BGxvY0KvQSDjv88mbo2d71huP4Oden6te1hJuioJYaLJ+pEQQP9nWtLr1+H3x3yLX97u5wQ1vXp+fiP2bMIWIeZpofj69+m83H0unSpA3P97u/ZPuKA9uY/uUiwoJq8PKAMcQ0bMH/frmYj/Zuon5ILe6I7spjNww2Va2x2+Ce7nBTO/hyj+vWMUF2iG0BiVFQVw2Wz1z6gGDvcddqxlsOurYP6eY6+0cfmPqXmXKIP5iuoQXo0KEDq1evLrVt9OjRxMXFERZ2ObtMmTKFKVOmVHV4prJhwwYe+8sj2C8WlmlaCouLuP/TuZzIPUe3pu2Y1XuUxyanso6cP81vPn+dsxdzr3n8I+dP8/zXnzA89uZScf613e98Fmd10bpuBP8d9kdCg2pw36d/Y1vmIeIbtQZgxpeLeffOh2kQWpthH83hk7unMKBNAr/q3J+CokJuee9pUzS04Pq2sF1j14/4l90Gsc1dP5euFbqlg7ExiXHKa1zc1ZYDZzO55d2pxDRoQQ1HEEvvecKa9abjdbxo0HoNVvDN8f1kX7zA6pHTmLT8DTYd3ccNzVxfIDy7bgmf3/Mk5y7m8bvVb/PenY8A8Fyfe+kfefm+N2arNTYbREa4fsS/bDZo39T1c6mhNfO6DGIdpruGtjybNm2q8PrZ8kydOpWWLVuybt06xo8fT8uWLdm3b5+PIzRGZGQkyx+bTcrI6ZzIPcu2zEMlj32452sSGkeyfPhTXCi8yHcnDpY0Oe72r6yVB7cxMq5npcZfeXAb/SPjy8Z5JN1ncVYXTWuFExpUA4BgexAO2+V/7lkXcmhZpyE1g0PIKcgnr+Aibeo1AiDI7iDIxLcoEBH/23JoT0njcrGokE1HL9dMd7UFoH9kPCtGTGXpPU8AWLPenM9i27ZtPosz0Gz4YW9Jc9ovMp71R/eUerxWjVCa1a5Petbxkm1PrpnPoIXP8u2JAwCqNSLic5ZoaLOzs9m9ezddu3a9pr8/c+ZMMjIyyM/P59SpU2RkZATMKclNmzYlNNh907I/6wTxEa5v5Do3jmT9D7s9NjneSj20g8Yv/4oBC2YS/fdHGPrBXwFYc3gnP4++wavxPY2R1Cq2bJx2cxe9Pn36GB1CubZmHuJk7jniIlqWbIuoWZe0zMNk5p5j+8nDZOXnlDz2j+9WcGf0tX14JCLXxmw5ZMP+HeU2Lu5qC0Dq4R30nT+DFze51rwwS70pbxy39cYRhMNhvnpjlvmRlZ9D3RDXmXL1QsLIupBb6vHjOWfZdeoIu079AMCkroPYMDqZl28dy+SV/yq1r2qNSNUxSw7xF0s0tLVr16aoqIiHH37Y6FBMy13T0qFBM9ZkuM6XTzm0g6z8XI/7e6tXqxi6N4tixYip9GoVw8sDxuB0OskpyKd2jVCvxvdmjFLjNIu86jir0quvvmp0CG6dzsvmsZXz+PugB0ttf7bXCP6Q8g4Tl79BfKPWRITVAVzX3S5L/5bf3/hzI8IVqbbMlkPO5pXfuLirLc1qhbN97F9ZPvwpVh1MY+sV35YaXW/KG8dtvTmfRVxc3FXH6W9mmR/1QmpyLj8PgHP5eYSH1ix57E+9R/LLT17mLxs/5uYWrmsVGoS5Vu1rX79ZqXFUa0SqlllyiL9YoqEVz07nnHPbtNwR1Y0LhRcZuPBZQhzBNKnpWqqvvCbnSsdyshiwYGapn3s/fgmA9KwTtK3nuqAx4/xpWtRpwHeZB0loHOn1+BWN4e04ZjFhwgSjQyijsLiIB5bO5c+9R9G0Vnipxzo0aMbSe57glVvH0apuBMGOII6cP80fUt7hzdsm4LArNYhUJbPlkLphtcptXNzVlpCgYGrVCCXI7uD2qC5sP3kYMEe9cTdOZt45t/XmH798/GpfqiphlvmR2Lw9qw+lAbDqYBo3NYu+4rEOLB/+FFMS7yKmYXMAzv34QfrJ3HMUFrtuKq5aI1L1zJJD/MWUi0KJ9woLC7l/3iy3TYvDbueF/g8AMOG/r3NrmwS3TU5hcRGn8rJpUuvy2vRNa4WzYsRUt79zx6kM4hq2pKi4GLvNBsDKA9sYEHmd1+N7GuPS3ymvGTOjlJQUo0MoY/H3G9h0LJ0nUucD8EzScBbs/IoX+j/AW9tW896OLwkLCubF/mMA14IeJ3LOMuyjOQB8/P/+h7AfT2cXEf8yWw5JbBvH60sXcU9MIqsOpnHfdUklj7mrLecv5lGnhusb3a+O7GZi14GG1JvyfsdPxym33tRrUPkXzw/MMj+6NGlLaFAwfefPoHPjSFrVjeBP6z/kicQh/Gn9h6w6mEaD0Nq88rNxAExJfY/tJzModhbzbNJIQLVGxAhmySH+oobW4hYtWsSmg9/zxNnzgKtpaVOvMW9tS+G+Tknc/+lc7DYbv+zUixZ1GrBg51dlmpyIsLrM3vgxrw38tVe/c8fJDBKbtye/qIATuec4mn2Gzcf3M7n7YBbuWu/V+J7GADfN2IgJ9EIrT16NEbE3MyL25lLbEpu7TgMbE9+XMfF9Sz32ys9+VWWxiYi5dW3dvlTj0r1ZNMdyssqtLcvSv2H6l4sIcQTTs0UMNzaLNqTeJDbvwIGzmRXWnFWH0tzXm42LmXX9a/To0cPHr2jguHLFa4AnEoeU/PfSny9xV1dUa0TE19TQWtzIkSO5J6sxzvQTpbZfKio//dTbXZOzZPdGhv9kmydTrihY3zzwZwB+0f5G7Da71+N7GsNdnDbds0VEpEr9tHFpWiu83NpyW7su3NauS6ltRtQbcF0LW1HNWbRrvdt6Y2vXmCA1syIilqKGVhja4cZKj3FPTGKlx/c0htkF8s2qRcT/qksO8Xe98fZ3WK3eVJf5ISL+Eeg5RA1tALA1N/81ppVl9ue4cOFChg0bVuW/16jXxezHQ8RqjMoh5amu/8bN+rxVY0SkMsxWY3xNDW0AcNyl+7gZbdq0aYYkCh17kcBgVA4pj3KLuajGiEhlmK3G+JrWSxcRERERERFLUkMrIiIiIiIilqSGVsQHXnnlFaNDEBELUw4RTzQ/RKQyAj2HqKEV8YFOnToZHYKIWJhyiHii+SEilRHoOUQNrYgP9O7d2+gQRMTClEPEE80PEamMQM8hamhFRERERETEktTQivhA9+7djQ5BRCxMOUQ80fwQkcoI9ByihlbEB77++mujQxARC1MOEU80P0SkMgI9h6ihFREREREREUtSQysiIiIiIiKWpIZWxAcWL15sdAgiYmHKIeKJ5oeIVEag5xA1tCIiIiIiImJJamhFfODuu+82OgQRsTDlEPFE80NEKiPQc0iQ0QFI5RV9tBnnD1lGh+FXtubhOO7qZnQYpmPUsdfxEKk+VGOqL9UYEbECNbQBwPlDFs70E0aHIQbQsRcRf1Oeqb507EXECnTKsYgPTJw40egQRMTClEPEE80PEamMQM8hamhFfGDSpElGhyAiFqYcIp5ofohIZQR6DlFDK+IDSUlJRocgIhamHCKeaH6ISGUEeg5RQyviA5mZmUaHICIWphwinmh+iEhlBHoOUUMr5Wr/j0d4d8dar7eLOek4iogZKTcFBh1HETGaGloRH4iLizM6BBGxMOUQ8UTzQ0QqI9BziBpaER94//33jQ5BRCxMOUQ80fwQkcoI9Bxi+YY2JSUFm83m9ufChQtGhyfVxNNPP210CCJiYcoh4onmh4hURqDnEMs3tJfMnj2bdevWlfoJCQkxOqyAdjznLEnvTWPAgpn0fGcqqw6mGR2SYRYtWmR0CJUyaOGzNJ87nuR1HxgdSsAqKjY6Au8VFhkdQfVj9RziD6oxl1l9fqjG+J+VaoyVYg0UVs8hFQkyOgBf6dixI4mJiUaHEVCC7Q4KiwrLbC8oLiLY7iAirA6rR0zDYbeTnnWcez9+mXWjnzEgUvGkouMI8M/bfsOqg2lknD9d1eEFrK2HYfWOy/8/9X24uT30jYVaJv2s7UwOrNoBG9Ivb3ttFfSLgw5NjYtLApNqTGBQjTHGjiOwaufl///jYugRDf1ioU6YcXF5ci4PVu+EdXsvb5u7wlUX41oYF5dYn6m/oS0uLmb27Nm0b9+e0NBQOnfuTGpqKh07duTBBx80OryAF1mvEXuzjpfaln3xAsdysmhXrzEOux2H3TWFzubnEt+otRFhSgUqOo4ALes0NCK0gLVsK7y5Bg6cvLwt9yKs2A5zPoPzecbFVp7j5+Cvy+CL3XDxivem3x+DV1aWfgMi4guqMYFBNabqrd4J/0iBfVe87BcKXNtnL4PT2YaFVq4zOfD8Z64YLxRc3r73uOu5rN5Z7l8VqZCpG9px48Yxc+ZMxo8fz7Jlyxg2bBgjR44kPT2dbt26ldp37NixBAUFUb9+fYYOHcquXbsMijpwjO6UxBtbV7E2YxdFxcWcuZDNb1f9m+siWnN9kzYA7M86QZ/50xm8eBZ3tb/B2IANlJqaanQI5fLmOIrv7D4Gn29z/dnp5vFT2fB/G6s0pAo5nfCvLyDnovvHABZucDW94h9mziH+ohrjPTPPD9WYqnXoFHy0xfVndzXmXB68u65KQ/LKO1/B2dyy2y89h4+2uJ6b+IeZc4gvmPaU4/nz5zNv3jxSUlLo3bs3AH379mXLli0sWbKErl27AlCvXj0mT55Mnz59CA8PJy0tjeTkZBITE9m0aRPR0dFGPg1LGxV3C3mFF3lkxVscOneS2jVC6dUylg9+8ThBP55G1Da8MSkjp5OedZyBC59lcFRXg6M2xvbt22ncuLHRYbjlzXEU3/nie7Dh/o0GP25Py3B9gt6gdhUG5sGBk/BDlud9nMBXe+AX3TzvJ9fGzDnEX1RjvGfm+aEaU7XW7q64xuw7AUezoFl4FQbmwdEsV0ye2HA9t1E9qiSkasfMOcQXTNvQJicnM2jQoJJm9pLo6GiCg4NJSEgAoEuXLnTp0qXk8aSkJAYOHEh8fDzJycm8+eabnDlzhtGjR7N7927CwsJo0qQJr7zyik+bXZvN5rOxrtby4U/Ru5V/7i81LqEf4xL6uX0sv7CAkKBgAOrWCKNWcKhfYgBISU3h1ocG+G18TyZPnlzhPnPmzKlwvzlz5vgqpBLeHntPx/FaGHk8zO43/8gipGa9Cve7edAv+f7Ld6sgoop1//mT3Dzs2Qr3e/+/Wxl6Q+cqiOjaPPqO6y2ekfnYHV/kEH/kD2+pxviXakxZqjHlG/viQeo0rPj0+0HDJrF1+dwqiKhiCbdOpO/9f/O4jxNY+fUh7r05smqCugaqMVXP6Szvo5vSTNnQZmRkkJaW5vaFP3ToEJ06dfK4gnFUVBSJiYls2LABcE28xx57jAEDXMnxpZdeYsyYMXzxxRf+eQLVxKZj+5i6diEOm52C4kKe73ef0SHJNfr1Z39n49G9XCwqZOPRvXw49PdGh2RZNrt3V3LYTfTNhc3LWGwOU5YMCVCqMYFDNcZ3vM3XZqox3sbi7XMT+Smb09vWtwqtX7+eHj168Omnn3L77beXbM/LyyMqKorbbruNN954w+MYffv2JTMzk7S0ssv8b9q0iSFDhpCRkeHz2I1Q+OpKnOkVnMthcbZ2jQma0N+Q3+3N9dixsbHs3Ol5RYOYmBhfhVTCqGNv5PEwu5eXQ3rm5WtPy/M/g81zOtiOI65FOTyxATe0g3tNfDrYYz9+4f3CvcbG8VO+yCH+yB/eUo3xL9WYslRjyvdGquuylYrevD9yK7QzyRmm6SfgpeWe97EBnVrCr3p73s9IqjHmZcpFoSIiIgDYvXt3qe3PPfccR48eLbMg1E/t2bOHDRs2cNNNN7l9/IUXXmDIkCG+CVYEmDFjhtEhiEn06uC5mbUBbSPM08wCxDSD8Jqu2MrjBG5pX1URVT/KIeKJ5odccksHz82sDWhaD9o2qqqIKta2kSumimpMrw5VFVH1E+g5xJTnj7Vr146EhASSk5Np0KABLVq0YPHixSxduhSgVEM7atQo2rRpQ7du3ahfvz5paWnMmjWLsLAwnnzyyTJjz5gxg71797Jq1aoqez4S+IYNG2Z0CGISCa2hayRsOVj2MRsQGgzDTXbLbLsdRvd03Z6n2Om+Ie8XB5ERVR9bdaEcIp5ofsglHZrCzdHwlZtbqdlsEOxwnUljpss8bTZXTC+vgIIi9zXm5mjd79yfAj2HmPIbWrvdzqJFi+jUqRMTJkxgzJgxREREMHHiRBwOR8mCUAAJCQksXbqUcePGMXDgQGbNmsWAAQPYuHEjUVFRpcZ95pln+OSTT/jss8+oWbNmVT8tCWCxsbFGhyAmYbfBL2+GwZ2h9hVr2NhsEN8KJg9yfVJtNlGN4dGfQfsmpbc3qAX33Ah3Xm9MXNWFcoh4ovkhl9hscPeNMKQb1Asr/VhsM3jsZ9DKhLf9bdXQFVtss9Lb64XBkK6uOmOmJjzQBHoOMeU3tAAdOnRg9erVpbaNHj2auLg4wsIu/wueMmUKU6ZMqXC8GTNmsHTpUpYvX054uInO9aukAwcOcNP/3E1MvWbUcASx9J4nSh77IfsMQ5b8hZ2njnDm0TcJsjvILchn5H9eJKcgn7ohNZl/5yMlq0hW1pHzp/nN569z9mIudpuNG5pGMbvv6Kse4/mvP2F47M08vvrtknH+2u53PomxOjlwNpNb3p1KTIMWZebGvG0pJK/7gB4tOvCvwRMBWHN4J0+kvofNZuO+Tkk8eL1WmLxWdjvcep3rW82M01BYBBF1y775MJvWDeGh/q575WblQEgwNK/vatKlentx01I+2LORlJHTPT7mKe9UlmqMOZU3N/IKLtLh9UeZN/gh+kfGM27Za+w6dYSwoBqM69yPkbE9jQk4ANht0CcGkjpAxhkoKISGdVyXjphZ8/rwYF/IyoVT5yE4CFrWd9VMkcowbUPrzqZNm0hMvPpz9bZv38706dOJioqiT58+Jdu//fZbH0ZnnP4x3fhX73FltjcIrcXnw57kng8vL8X9+f7v6N4smqduHsqf1n/I5we+4+fRvrlZ/cqD2xgZ15OhHW4kNKgG9336N7ZlHiK+UcXLy185Rv/IeFrXjeC/w/54eZwj6XRBC0Rcrf6R8SUN65XuiOrKLS1jmPnV+yXb5mz6lPk/f5SWdRrQ691pamh9wGG35mm6DWu7fkQA8gsu8t0JN+fQ47q1zk8fKy/vVJZqjPm4O/6XvLltNdc1alVq278GTyS6vs4r9RW73fVBpNWE1zR/8y3WYpmGNjs7m927d/PQQw9d9d/t1KmT1/cxsqLU3d/S94cZDGnfnUdvuLwqdGhQDUKDapTat114EzYe3QfA2Qs5NAy9+netqYd2cM9Hz5PQKJIDZzNJaBzJkl/8jjWHd/JC/wdKfmewPQiHrfyP3dyN0yC0Fi/0f4DaNS6fqxlsD8Jh8qXcr/ygxExSD++g7/yycyOiZl2yC/JL7duxfjPO5ufSKKwutYLLvy2WiPieWXMIwJtfLWP0dUnM+HJRmcfe2pZS5rHy8o63VGPKMuv8cHf8AS4WFbLh6B56NL+8yo8NGLvsVRqE1ubF/g8QWc9EqxaJBDiz5hBfscyX/LVr16aoqIiHH37Y6FBMpVmzZuyYPo/lw59i1cE0tmYe8rh/+/pN2XB0D53f+j2bj++nR4urX1KuV6sYujeLYsWIqfRqFcPLA8bgdDrJKcgveZOwNfMQJ3PPERfR8qrGuXKMUuM0M++NtgFeffVVo0Moo1mtcLaP/avXc+Ou9t35+fvPEf/m44yKu6WKohQRMGcOASgoKGDNnu/o27pT2ceKCl3N6xWPXW3ecUc1piwzzg93x/+Sf6elMiq2dB15rs8vWTNqBr+/8U7+kPJuVYUpIpgzh/iSZRpacS8kJIRaIWEE2R3cHtWF7ScPe9z/7e1rGNyuC9+N+Qu3tbued3esdbvfsZwsBiyYWern3o9fAiA96wRt67lubpZx/jQt6jTgu8yDJDR2vSE4nZfNYyvn8fdBD3qM5afjZOadKxnjasYxgwkTJhgdQhkhQcHUqhHq9dz44xcLWDNqBjt+9Txvb19D7k++wRUR/zFjDgF4++23GXGD+1Nx392xlhGxN5fa5m3eUY25OmacH+6OP0BhcRH/PbCVQe1KryTXIMx1RljPljEcz82qkhhFxMWMOcSXLHPKsbh3/vx5Lq0z89WR3UzsOtDj/k7n5aISEVaHc/l5FBYXcSovmya1Li+92rRWOCtGTHU7xo5TGcQ1bElRcTH2H5ekW3lgGwMir6OwuIgHls7lz71H0bSWa/Etd+O7G+fSGJf+zk/HMbOUlBSjQyjj/MU86tRwzQ5v5obDZic8tCY1HEHYbXYKiouqIkwRwZw5BOD777/nmy9W8o+8AnaczGDuls9Lcsn3p4+yNfMAr3+3suSx+65LKpN3VGMqz4zzw93xn9h1IMdzznL43CnuWDyLfVnHWZb+LV3vaYvDZqduSE2+P/0D4SG1jA5fpFoxYw7xJTW0FvfFF1/w1J8eI6QIeraI4cZm0RzLyeKtbSk83v0O7nz/z2zNPMjgxbOY2Ws4I2Jv5t5PXuLd7WsJdjh4945HOHA2k9kbP+a1gb/26nfuOJlBYvP25BcVcCL3HEezz7D5+H4mdx/Mwl3r2XQsnSdS5wPwTNJwIsLquh3/p+OsOpTG5O6DAVj8/YbS44yYQC8t2HFV1mbsYvqXiwhxBJfMjcdWzuOF/g/w6b4t/GXjf0jPOsGwj+aw8K7JPH7jnQxamIzdZmNg2+upF6IVG0Squz//+c8UtlmJM/0EfeZPZ2LXgSU15k+9R5bsd+mxZenflMk7e88cU40JQD89/v+v4038af2HPJE4hHWjnwHgf79cTM+WHakfWpshS/5CVn4ONmy8PGCsUWGLSACyOQN5taRqovBV15uNa7Vk90bqh9Zyex2MtxbtWs89Me5XoPZ2fE9j2No1JmiCMW82du3aVeE+sbGx7Ny50+M+MTExvgqpRGWP/bUy8niIlOexHy/Le+FeY+P4KV/kEH/kD2+pxviXakxZqjFiRqox5qVvaIWhHW6s9BjlvUm4mvE9jWF2Fb3REBHxJJBziGpM5QXy/BAR/wv0HKJFoUR8YOHChUaHICIWphwinmh+iEhlBHoO0Te0AcDW3PwLWlSW2Z/jtGnTGDZsWJX/XqNeF7MfDxGrMSqHeKM6/Hs3+3NUjRGRyjBzjfEFNbQBwHFXN6NDEIPo2IuIvynPVF869iJiBTrlWERERERERCxJDa2ID7zyyitGhyAiFqYcIp5ofohIZQR6DlFDK+IDnTpd++0oRESUQ8QTzQ8RqYxAzyFqaEV8oHfv3kaHICIWphwinmh+iEhlBHoOUUMrIiIiIiIilqSGVkRERERERCxJDa2ID3Tv3t3oEETEwpRDxBPNDxGpjEDPIWpoRXzg66+/NjoEEbEw5RDxRPNDRCoj0HOIGloRERERERGxJDW0IiIiIiIiYklqaEV8YPHixUaHICIWphwinmh+iEhlBHoOUUMrIiIiIiIilqSGVsQH7r77bqNDEBELUw4RTzQ/RKQyAj2HBBkdgFRe0Uebcf6QZXQYfmVrHo7jrm5Gh2E6Rh17HQ+R6kM1pvpSjRERK1BDGwCcP2ThTD9hdBhiAB17EfE35ZnqS8deRKxApxyL+MDEiRONDkFELEw5RDzR/BCRygj0HKKGVsQHJk2aZHQIImJhyiHiieaHiFRGoOcQNbQiPpCUlGR0CCJiYcoh4onmh4hURqDnEDW0Uq72/3iEd3es9Xp7dZaZmWl0COXScRQxPzPnEH9RbvKemeeHjqOI+Zk5h/iCGloRERERERGxJDW0Ij4QFxdndAgiYmHKIeKJ5oeIVEag5xBLN7QpKSnYbDa3PxcuXDA6PKlG3n//faNDEBELUw4RTzQ/RKQyAj2HWLqhvWT27NmsW7eu1E9ISIjRYQW84zlnSXpvGgMWzKTnO1NZdTDN6JAM8/TTTxsdQqUMWvgszeeOJ3ndB0aHIlItWT2H+INqzGVWnx+qMSLGsnoOqUhANLQdO3YkMTGx1I/NZjM6LMsLtjsoLCoss72guIhgu4OIsDqsHjGNFSOm8vYdk/jjmgUGRGkOixYtMjqEclV0HAH+edtvmNV7VFWHJuIThUWw+cDl/0/ZCTn5hoVzTcycQ/xFNcZ7Zp4fqjES6IqK4btDl/9/xXY4b7ETQc2cQ3zBtA1tcXExs2fPpn379oSGhtK5c2dSU1Pp2LEjDz74oNHhVQuR9RqxN+t4qW3ZFy9wLCeLdvUa47DbcdhdU+hsfi7xjVobEaZUoKLjCNCyTkMjQhOptAMnYfqH8PaXl7d9uAWmLYH1e42LSyqmGhMYVGMkkP1wBmZ+BG99cXnbJ9+6akzqLuPiktJM29COGzeOmTNnMn78eJYtW8awYcMYOXIk6enpdOvWrdS+Y8eOJSgoiPr16zN06FB27dIM84XRnZJ4Y+sq1mbsoqi4mDMXsvntqn9zXURrrm/SBoD9WSfoM386gxfP4q72NxgbsLjlzXEUsaLM8/DqSshx80l5YTEs2FD6U3UxF9WYwKAaI4EqKxf+tgLO5pZ9rNgJH2yGDfuqPi4pK8joANyZP38+8+bNIyUlhd69ewPQt29ftmzZwpIlS+jatSsA9erVY/LkyfTp04fw8HDS0tJITk4mMTGRTZs2ER0dbeTTsLxRcbeQV3iRR1a8xaFzJ6ldI5ReLWP54BePE/TjaURtwxuTMnI66VnHGbjwWQZHdTU4amOkpqYaHUK5vDmOIla0eidcLARnOY/bgKVbIaEVmP0qFDPnEH9RjfGemeeHaowEqi++h9yLnvdZthW6twW7ab8idDFzDvEFUza0oaqONAAADRpJREFUycnJDBo0qKSZvSQ6Oprg4GASEhIA6NKlC126dCl5PCkpiYEDBxIfH09ycjJvvvkmAEOGDCE9PR2Hw0FwcDDJyckMGDCg6p6QhY1L6Me4hH5uH8svLCAkKBiAujXCqBUcWpWhmcr27dtp3Lix0WGUy9NxFLGiYid8nV5+Mwuux46fhSNnoGWDqors2pg9h/iLaox3zD4/VGMkEG1Ir3ifrFzYlwntm/g/nsowew6pLNM1tBkZGaSlpTF58uQyjx06dIhOnTp5XME4KiqKxMRENmzYULJt3rx5hIeHA/DNN9/Qp08fTp8+jcPhu08OjVyEavnwp+jdqurvL7Xp2D6mrl2Iw2anoLiQ5/vd57fflZKawq0PGfMhhLu5+FNz5sypcL85c+b4KqQSvjr2v/7s72w8upeLRYVsPLqXD4f+3uP+Rh4PEYDg0No89M/zXu17S9/bOLj1Mz9HVD5f5BB/5A9vqcb4l2pMWaoxYgaP/LsQmxdnGdwxZAS71/9fFUTkntVrjCdOp6ePrS8zZUML0LRp01Lb8/LySE1N5bbbbqtwDKfTWarBvNTMApw9exabzeb1CyTl69kyhlUjAnsZ8Ori9UHjjQ5B5KoU5udSWHCBIC++tbuQfbIKIhJfU40JHKoxYkUXcs4QVieiwv3yzqvGGM3mNFlnt3fvXtq3b8+cOXN47LHHSrbPmDGD6dOnM3fuXB566KFy//6ePXvo3LkzI0eO5I033ijZPnHiRJYtW8bZs2dZuHAh/fv39+vzqEqFr67EmX7C6DD8ytauMUETjDlm3iwyFhsby86dOz3uExMT46uQShh17I08HiKXvLfO82nHNqBhHfjjncZeQ+uLHOKP/OEt1Rj/Uo0pSzVGzOCDzRWvZFwnFKb/AhwGXkNr9RrjC6b7hrZdu3YkJCSQnJxMgwYNaNGiBYsXL2bp0qUApVY4HjVqFG3atKFbt27Ur1+ftLQ0Zs2aRVhYGE8++WSpcefOnQu4LoqePHkya9asoXbt2lX3xCSgzZgxw+gQRKqdfnGw5SAUFblvap3AoHjzLwgFyiHimeaHSNVL6gjr98HFgvI/OB0Yb2wz661AzyGmOwR2u51FixbRqVMnJkyYwJgxY4iIiGDixIk4HI6SBaEAEhISWLp0KePGjWPgwIHMmjWLAQMGsHHjRqKiotyO37t3b+x2O19++aXbx0WuxbBhw4wOQaTaaVoPxveBENe6Qdhsl5tXmw2GdIUb2hoW3lVRDhFPND9Eql7D2jChH9T8cemeK2sMwKAE6NnemNiuVqDnENN9QwvQoUMHVq9eXWrb6NGjiYuLIywsrGTblClTmDJlisexsrOzOXXqFJGRkYBrUah9+/YRGxvr+8Cl2vLmdLCqlpZ5mIeW/xOHzU5UeBNeHzS+5NryP63/kNe++S/3x/fhf29xJblxy15j16kjhAXVYFznfoyM7Wlk+CJead/UdbrX5v2w+xgUOaFFfegRDeE1jY7Oe2bMIWIeZpwfnmrM4u/X8/zXn2DDxv8k3sXPo29QjRFLahMB04a4zgba+QMUFbs+TO0R7Wp4rcKMOcSXTNnQurNp0yYSExOv+u/l5OQwfPhwsrOzCQoKIjQ0lHfeeYfWrVv7Icqql5aWxq//8giOi0VlCsoP2WcYsuQv7Dx1hDOPvkmQ3cGBs5nc8u5UYhq0oIYjiKX3POGzWI6cP81vPn+dsxdzsdts3NA0itl9R1/1GM9//QnDY2/m8dVvl4zz13a/81mc1UXHBs1YM8p1ismvlr3G5mPp3NDMdebC2Pi+9GjenlWHtpf6O/8aPJHo+k3LjCViZqHB0LOD60d8L+2H/Ux47zm3jUtuQT4j//MiOQX51A2pyfw7H+FoTpb16kzH63hR12xeFU815qXNy1gxfCo2bNzx/ix+Hn0DoBoj1lQjCBKjXD9iTpZoaLOzs9m9e7fHxaDK06RJE9avX++HqMyhY8eOfPH7l3CmnyhTUBqE1uLzYU9yz4ell+LuHxnPvwZP9HksKw9uY2RcT4Z2uJHQoBrc9+nf2JZ5iPhG3n94sPLgNvpHxtO6bgT/HfbHy+McSacLerNxNYIdl/95hwQF07Juw5L/b1KrHrtOHSm1vw0Yu+xVGoTW5sX+DxBZr1EVRSoiZtaxSatyG5fP939H92bRPHXzUP60/kM+P/AdCY0irVdnUv/Jtm3biI+P93nMgcpTjWkX3oScgnwA6tRwnVmnGiMi/mKJhrZ27doUFRUZHYYpBQcHU/jjn39aUEKDahAaVKPM30k9vIO+82cwpH13Hr3h9qv+namHdnDPR8+T0CiSA2czSWgcyZJf/I41h3fyQv8HSn5nsD0Ih638y7TdjdMgtBYv9H+A2jUu34oj2B6Ew4v7gBmpT58+Rofg1sd7NzP1i/8jun5TGoZ6PjfmuT6/pEFYbb7M2MUfUt7l/+56zOP+IuI7Zs0h4GpcLi2I4q5x2Xh0HwBnL+SU5Bkz1JmKxihVZxxBPr03va+ZdX6UV2Puir6BG//9JE6cJbfsUY0RMY5Zc4ivmG5RKLl6H2/9iuvf+gPHc85W2LQ0qxXO9rF/Zfnwp1h1MI2tmYeu+vf1ahVD92ZRrBgxlV6tYnh5wBicTic5BfklbxC2Zh7iZO454iJaXtU4V45RapxmkVcdZ1V69dVXjQ7BrTuju/HtmOdoWacBn6Z/43HfBmGuudOzZQzHc7OqIjwR+ZFZc8glH+/d7LbOtK/flA1H99D5rd+z+fh+erToYJo6480YJeOczyIuLu6q46wqZp0f5dWYZ9d9wP9v7/5D4q7jOI6/nDq1YznXMttilVlI/sBFjlmsQ3CscosxyI0WktEPJIgG6w//KAcr2lpFLWbWPwvCCmdjsBaOsiys1lqQM+U2Ym1lZTp/4I/dzl/XH3bXdOf3Tu97u+/39nyAINz33ve57318v33z/dz301rxqk5W7NHL3x+URI0BosmqOcQsNLQxYEP+PSE3LUkJiXIsTFbCgng9eNtKtZ//I+BxXSMDKvl457SfrYf3SpLODHTr1tR0SVLnUJ+WL1qi1p5zyk+fajr73MN6rul9vXv/U4ZjmRmnxz3ojzGXOFZQWVkZ7SFcxjM+5v990cIUpQS4Wn+pQc8FSdKpvr+0OMkR0bEBmM6KOeRSszUuH7R/o9LMlWqt2KMHMgtU19FimToTLMalcd57dHt4JyjCrDg/jGpMUnyCrklMkiMxWaMTU+vIqDFA9Fgxh5jJFkuOMTuPxyPfIqlQmpahUbf/+yzf/Xlaz9y1TuOTE+p1D+sGR6r/uAzHYn2x5YWAMTp6O3XndTdpYnJSC/67MUjT2TaV3Jyr8ckJPfbZPu12PqIMx2JJChg/UBxfDN9zZsaxsubm5mgP4TJHz7bqrRNT+zdnpWUo7/oVeuXYIVWt3qj9bV+p9ufP1e8e0cDFEe0tqVD5kX0a8IwoTnF6u+TxKI8euLpYMYf4eMZG5assM+uM1/v/lbelKYs06HFbps4YxfA9xx8ndYkJZypyrDg/jGrM0wUlcn64Q5L0RP7U/S+oMUD0WDGHmImG1uYaGxv1+hsvShdHlZWWobW35KlrZED725q1vXC9NnyyWyd7zqm0YZd2rtmsXveQdnx7QEnxibp3ebZW3ZilX/u79Nrxw6pd92RIr9lxvlOrl90uz8SYui8M6u/hfv30z2/aVliqetcxneg6o6qvP5IkvXTfZi1NuTZg/Jlxvvz9F20rLJUkNZz6YXqcLZVaw02h5uShrLv9d5b0qVq9UZJUkVesirziaY8d2vT8FRsbAPs42vGj3jwylYtn1pnKgrXa+ule1bW3KDE+XnXrn1VLp8sSdcYohjSjzhxv0K6CWhUVFZl89mKXUY0pz3WqPNc57TFqDIBIifN6vd7gh8HKxt9pkvdM97yff/D0caUlO1S8ImfeMQ64junh7MDbKoUa3yhGXGa6EqK0pYLL5Qp6TCj7e2VnZ5s1JL9wP/v5iubnAdiNGTkkEvkjVGbkGavXGWpMYNQYwPrsXmPMwBVaaNMdq8KOMds/GXOJbxTD6mJ5s2oAkRfrOYQ6E55Ynx8AIivWcwgNbQyIW2b975iGy+rvsb6+XmVlZVf8daN1Xqz+eQB2E60cEoqr4e/d6u+RGgMgHFauMWZgyTEQhJWXgwGwPpaDwQg1BkA4qDFs2wMAAAAAsCkaWgAAAACALdHQAiaoqamJ9hAA2Bg5BEaYHwDCEes5hIYWMEFOzvy3ogAAcgiMMD8AhCPWcwgNLWACp9MZ/CAAmAU5BEaYHwDCEes5hIYWAAAAAGBL7EMLBBHKrcyrq6ttf8tzAJFBDoER5geAcJBD2IcWAAAAAGBTLDkGAAAAANgSDS0AAAAAwJZoaAEAAAAAtkRDCwAAAACwJRpaAAAAAIAt0dACAAAAAGyJhhYAAAAAYEs0tAAAAAAAW6KhBQAAAADYEg0tAAAAAMCW/gUGE7wDHKUTWQAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 1237.65x264.88 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 12
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7w7QwrkYvSYE",
        "colab_type": "text"
      },
      "source": [
        "The fitness value is taken to be the negative of minimum distance ($\\epsilon$), which is given by: $$\\epsilon = min_\\theta || \\left| \\psi(\\theta) \\right\\rangle - \\left| \\phi \\right\\rangle ||$$  Fitness values of all the parameters are found and a set of those which have the highest values ($i.e.$ minimum $\\epsilon$ value) are chosen to become the parents for the next generation. "
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fv5tqnHrHBnd",
        "colab_type": "code",
        "tags": [],
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 153
        },
        "outputId": "cf700b1e-1fac-4863-c477-23ca9cae107f"
      },
      "source": [
        "def cal_fitness(population, L):\n",
        "  \"\"\" Calculates the fitness of the population \"\"\"\n",
        "  fitness = []\n",
        "\n",
        "  for params in population:\n",
        "    qc = generate_qc(L, params)\n",
        "    final_state = execute(qc, \n",
        "                          statevector_backend, \n",
        "                          backend_options={\"method\": \"statevector_gpu\"}).result().get_statevector()\n",
        "    fit = np.sum(np.abs(final_state-phi_state)**2)\n",
        "    fitness.append(-fit)      \n",
        "    \n",
        "  return fitness\n",
        "\n",
        "fit0 = cal_fitness(pop0, L)\n",
        "fit0"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[-14.850305296331324,\n",
              " -16.17747495977596,\n",
              " -17.206373473386996,\n",
              " -17.988750822035527,\n",
              " -19.47880095756584,\n",
              " -17.075256487474505,\n",
              " -18.394708435746836,\n",
              " -16.214468443304554]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 15
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "0KxM6_PKHBnn",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 153
        },
        "outputId": "62f9173b-1966-4404-9640-b0a0a632372a"
      },
      "source": [
        "def select_mating_pool(population, fitness, num_parents):\n",
        "    \"\"\"Selects the best individuals in the current generation as parents\"\"\"\n",
        "    parents = []\n",
        "    for parent_num in range(num_parents):\n",
        "        max_fitness_idx = fitness.index(max(fitness))\n",
        "        parents.append(population[max_fitness_idx])\n",
        "        fitness[max_fitness_idx] = -999\n",
        "    return parents\n",
        "\n",
        "mpool = select_mating_pool(pop0, fit0, sol_per_pop//2)\n",
        "mpool"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[array([0.85441479, 2.91687285, 5.17607191, 3.15014447, 2.93562011,\n",
              "        0.95203069, 4.45243956, 3.84725297]),\n",
              " array([0.64943943, 0.72646726, 2.07725365, 6.17145479, 3.34322777,\n",
              "        4.5609759 , 1.45695532, 5.20937418]),\n",
              " array([1.28713727, 3.98279788, 0.3576358 , 4.45585485, 3.90527631,\n",
              "        0.42383009, 3.7897873 , 1.54452234]),\n",
              " array([0.52795316, 0.81194667, 6.25962102, 4.89691905, 1.96256235,\n",
              "        3.24273847, 4.33464594, 4.77592117])]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 16
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XMXKVC6xw_OD",
        "colab_type": "text"
      },
      "source": [
        "The selected parents generate offsprings by crossover and mutation. Crossover involves mixing of genes between two parents and mutation involves mutating a random gene in the generated offspring."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eWts4OyrHBnp",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 153
        },
        "outputId": "5e824545-d4c4-423a-8447-84cf751a9ccd"
      },
      "source": [
        "def crossover(parents, offspring_size):\n",
        "  \"\"\"Generates offsprings by crossover between parents\"\"\"\n",
        "    offsprings = []\n",
        "    # The point at which crossover takes place between two parents\n",
        "    crossover_point = num_qubits//2\n",
        "\n",
        "    for i in range(sol_per_pop//2):\n",
        "        # Index of the first parent to mate\n",
        "        parent1_idx = i%len(parents)\n",
        "        # Index of the second parent to mate\n",
        "        parent2_idx = (i+1)%len(parents)\n",
        "        offspring = np.concatenate((parents[parent1_idx][:crossover_point],parents[parent2_idx][crossover_point:]), axis=0)\n",
        "        offsprings.append(offspring)\n",
        "\n",
        "    return offsprings\n",
        "\n",
        "ofc = crossover(mpool, 2)\n",
        "ofc"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[array([0.85441479, 2.91687285, 2.07725365, 6.17145479, 3.34322777,\n",
              "        4.5609759 , 1.45695532, 5.20937418]),\n",
              " array([0.64943943, 0.72646726, 0.3576358 , 4.45585485, 3.90527631,\n",
              "        0.42383009, 3.7897873 , 1.54452234]),\n",
              " array([1.28713727, 3.98279788, 6.25962102, 4.89691905, 1.96256235,\n",
              "        3.24273847, 4.33464594, 4.77592117]),\n",
              " array([0.52795316, 0.81194667, 5.17607191, 3.15014447, 2.93562011,\n",
              "        0.95203069, 4.45243956, 3.84725297])]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 17
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PpFbMfwQHBns",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 153
        },
        "outputId": "c87b1fd9-e184-4396-a4c4-31787c20531a"
      },
      "source": [
        "def mutation(offspring_crossover):\n",
        "    \"\"\"Creates mutation at a random gene in the offsprings\"\"\"\n",
        "    for idx in range(len(offspring_crossover)):\n",
        "        # The random value to be added to the gene.\n",
        "        random_idx = np.random.randint(num_qubits)\n",
        "        random_value =  2*np.pi*np.random.rand(1)\n",
        "        offspring_crossover[idx][random_idx] = random_value\n",
        "    return offspring_crossover\n",
        "\n",
        "ofm = mutation(ofc)\n",
        "ofm"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[array([0.85441479, 1.16009666, 2.07725365, 6.17145479, 3.34322777,\n",
              "        4.5609759 , 1.45695532, 5.20937418]),\n",
              " array([0.64943943, 0.72646726, 0.3576358 , 2.3671659 , 3.90527631,\n",
              "        0.42383009, 3.7897873 , 1.54452234]),\n",
              " array([1.28713727, 1.78482693, 6.25962102, 4.89691905, 1.96256235,\n",
              "        3.24273847, 4.33464594, 4.77592117]),\n",
              " array([1.58647135, 0.81194667, 5.17607191, 3.15014447, 2.93562011,\n",
              "        0.95203069, 4.45243956, 3.84725297])]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 18
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FVueJsu-yIae",
        "colab_type": "text"
      },
      "source": [
        "The next generation consists of parents and offsprings from the previous generation. This process repeats for a number of generations usually after which there is not much difference in the fitness of individuals."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "tags": [],
        "id": "_V2NpaxcHBnv",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "L = 2\n",
        "sol_per_pop = 20\n",
        "num_generations = 50\n",
        "\n",
        "def genetic_algorithm(sol_per_pop, num_generations, L, verbose = True):\n",
        "  \"\"\"Implements the genetic algorithm\"\"\"\n",
        "    fitness_g = []\n",
        "    new_population = init_pop(sol_per_pop, L)\n",
        "    num_parents_mating = sol_per_pop // 2\n",
        "\n",
        "    best_fitness = -99\n",
        "\n",
        "    for generation in range(num_generations):\n",
        "    \n",
        "    # Measuring the fitness of each chromosome in the population.\n",
        "        fitness = cal_fitness(new_population, L)\n",
        "\n",
        "    # Selecting the best parents in the population for mating.\n",
        "        parents = select_mating_pool(new_population, fitness, num_parents_mating)\n",
        "\n",
        "    # Generating next generation using crossover.\n",
        "        offspring_crossover = crossover(parents, offspring_size=sol_per_pop-len(parents))\n",
        "\n",
        "    # Adding some variations to the offsrping using mutation.\n",
        "        offspring_mutation = mutation(offspring_crossover)\n",
        "\n",
        "    # Creating the new population based on the parents and offspring.\n",
        "        new_population = parents + offspring_mutation\n",
        "\n",
        "        fit_gen = np.max(fitness)\n",
        "\n",
        "    # Getting the best solution \n",
        "        if fit_gen > best_fitness:\n",
        "            best_fitness = fit_gen\n",
        "            best_fitness_idx = np.where(fitness == fit_gen)[0][0]\n",
        "            best_sol = new_population[best_fitness_idx]   \n",
        "\n",
        "        if verbose == True:\n",
        "            fitness_g.append(fit_gen)\n",
        "    \n",
        "    if verbose == True:\n",
        "        return best_fitness, best_sol, fitness_g\n",
        "    else:\n",
        "        return best_fitness, best_sol\n",
        "\n",
        "best_fitness, best_sol, fitness_g = genetic_algorithm(sol_per_pop, num_generations, L)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "tags": [],
        "id": "xl6VjIz6HBny",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 68
        },
        "outputId": "3b57071c-3d87-4435-e23c-315a3973bdfd"
      },
      "source": [
        "print('Fitness :', best_fitness)\n",
        "print('Parameters :', best_sol)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Fitness : -10.734620703206373\n",
            "Parameters : [0.89763791 4.44366824 2.09860692 4.47360075 0.21737684 3.17692573\n",
            " 4.03385876 0.48021399]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "pQxFk2piHBn1",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 296
        },
        "outputId": "87526796-c04a-4c27-a9c8-6585970b8718"
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "plt.xlabel(\"Generation\")\n",
        "plt.ylabel(\"Best fitness in the generation\")\n",
        "plt.plot(fitness_g)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f85549025f8>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 21
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hL6dKAiB0xu8",
        "colab_type": "text"
      },
      "source": [
        "#### Plotting the minimum distance ($\\epsilon$) against the number of layers ($L$)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "tags": [],
        "id": "Xl9vkuEtHBn7",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# %%time\n",
        "sol_per_pop = 20\n",
        "num_generations = 300\n",
        "L = 10\n",
        "\n",
        "y = []\n",
        "for l in range(1,L):\n",
        "    qr = QuantumRegister(4, 'q')\n",
        "    qc = QuantumCircuit(qr)\n",
        "\n",
        "    best_fitness, best_sol = genetic_algorithm(sol_per_pop, num_generations, L, verbose = False)\n",
        "    y.append(best_fitness)    \n",
        "    # print(\"Executed Layer: \"+l)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "V80P7JZUHBn9",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 296
        },
        "outputId": "8829ac87-2630-45c9-f586-92982525d4c6"
      },
      "source": [
        "plt.xlabel(\"# of Layers (L)\")\n",
        "plt.ylabel(\"Minimum Distance\")\n",
        "plt.plot(list(range(1,L)), -1*np.array(y), linestyle='dashed', marker='o', markersize=9) "
      ],
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f8554477d68>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 27
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXyU9bX48c+ZyR5CgCRA2AIJmywiGBDCYl2gilbtota61Cpi+6utvXhva+/Squ3t5tW29rZeEb1oXWpbtW6oUK+VRHZZAwJZQFYlIRAC2TPn98dMMMIkmSQz80wm5/16zSvJM888z2HJnPlu5yuqijHGGHMml9MBGGOMiUyWIIwxxvhlCcIYY4xfliCMMcb4ZQnCGGOMXzFOBxBM6enpOnz4cKfDMMaYbuODDz4oV9UMf89FVYIYPnw4GzZscDoMY4zpNkTko9aesy4mY4wxflmCMMYY45clCGOMMX5F1RiEMZGmsrqBZYWHKauqIyMlnvkTMklNinU6LGMCYgnCmBBQVR5esZvFK0txuYTa+iYS4tzc9+p2Fs7JZtHc0YiI02Ea0yZLEMaEwMMrdrMkfw91jZ7Tx2rqmwBYkr8HgHvmjXEkNmMCZWMQxgRZZXUDi1eWUtPQ5Pf5moYmFq8spbKmIcyRGdMxliCMCbJlhYdxudruPnK5hGXbDocpImM6xxKEMUFWVlVHbb3/1kOz2vomyqrqwhSRMZ1jCcKYIMtIiSchzt3mOQlxbjJS4sMUkTGdYwnCmCCbPyETj6ftnRo9HmX+xMwwRWRM51iCMCbIUpNiWTgnm8TY1lsRk4f2oXeCTSI0kc0ShDEhsGjuaBbMHkF8jIvEWDcCJMa5iY9xMXZgCmv2VPCLt3Zie8KbSGYfYYwJARHhnnljWDAr+7MrqSdmkhIfw49f3c5j75Vyqq6RB66a0O6sJ2OcYAnCmBBZkl9K4cFKHr7uvLMSwANXjycp3s2S/D185fyhnDe0j0NRGtM6SxDGhMgb2w6jit/WgYhw72Vj+eLkwYwd2Bvwluew8hsmktgYhDEhUFnTwJb9x5kzKr3Vc0TkdHJYvv1j7nh6A7WtrL42xgmWIIwJgdUl5XgUZo3yu5PjWY5XN/DOziN8/cl1nKxrDHF0xgQmZAlCRJ4UkSMiUtji2E9EZKuIbBaR5SIyqJXXNvnO2Swir4YqRmNCJb+onOQ4N5OHBTa2cN3Uofzm+vPY8NExblyyluPV9SGO0Jj2hbIFsRS47IxjD6rquap6HvA68KNWXlujquf5HleFMEZjQmJovySumzqUWHfgv2JXnzeYR2+cwoeHTvDVxWusJWEcF7JBalVdKSLDzzh2osWPyYBNAjdR6ZsX5nTqdfPGD+SJW3MpKPa2QIxxUthnMYnIfwK3AJXARa2cliAiG4BG4Beq+rc2rrcQWAgwbNiwIEdrTMeVn6wjNTG2Q62HlmaPymC2b+yi+MhJYt1CVlpyMEM0JiBhH6RW1X9T1aHAs8BdrZyWpaq5wNeA34hIqx/HVHWxquaqam5GRmADgsaE0r+/XMiVjxR0+Toej3LXcxu57rHVFB+pCkJkxnSMk7OYngW+7O8JVT3o+1oK/AOYHL6wjOm8xiYP75eUB2Xhm8sl/Park2nywHWPraHwYGUQIjQmcGFNECIyqsWPVwM7/ZzTV0Tifd+nAzOBHeGJ0Jiu2XqwkqraRmaPbn39Q0eMGZjCX745g4QYFzc8voYPPjoWlOsaE4hQTnN9HlgNjBGRAyJyO/ALESkUka3APOBu37m5IrLE99JzgA0isgV4F+8YhCUI0y3k7y5HBGbmBCdBAIxIT+Yv38ojLTmO379bHLTrGtOeUM5iusHP4SdaOXcDsMD3/SpgYqjiMiaU8ovKmDg4lb7JcUG97uA+ifz5mzNIivP+ylpZDhMOVovJmCD6l8+Poa7RE5Jr909JAKC6vpHblq7npulZXHmu37WmxgSFJQhjguiC7LSQ36PJozR5lO8+v4nq+iauyx0a8nuanslqMRkTJG9v/5g1pUdDfp+UhFieum0aM0em8/2/bmXp+3tCfk/TM1mCMCZIfvHmTh57ryQs90qKi2HJ13OZN24A9722g6dX7w3LfU3PYgnCmCDYX1HNnvJTAVdvDYb4GDe/v3EKt+YNP73y2phgsgRhTBAUFJcDtLn/QyjEul3cd9V4RqQno6q8sfUwHo+VODPBYQnCmCAoKCpnQO94Rvbv5VgM73x4hG8/t5F7X9pKkyUJEwSWIIzpIlWl8FAls0dlOLo24ZJz+vPdS0bx5w0HuPtPm2hoCs10W9Nz2DRXY7pIRHhn0YWcqnN2u1ARYdHc0STHufn5mzupbWjiv782hYRYKxtuOscShDFBEON2kZoUGQ3yOy/MISk+hp+8toPCg5XkDu/ndEimm7IEYUwX/fNftjBmQAp3zMl2OpTTbp6exSVj+zOoTyLgXVzndllpDtMxkfGRx5hu6lRdI69sPkj5qTqnQzlLc3J4bcshvviH9zl6MvJiNJHNEoQxXbB2z1EampQ5EbwOISUhhl0fV3H94jV8cqIWgMrqBp5ft49H3ini+XX7qKxucDhKE4msi8mYLsgvKic+xsX5WX2dDqVVnxvTn6dum8btS9fzlUdXcdHY/rywfj8ul1Bb30RCnJv7Xt3OwjnZLJo72qrEmtOsBWFMF+QXlXNBdlrEzxSanp3GMwsu4EhVHU+v/oi6Rg819U0oUFPfRF2jhyX5e3h4xW6nQzURxBKEMZ3U0ORh4uBU5k8Y6HQoAclO74W2sX6upqGJxStLqayx7ibjZQnCmE6Kdbv49fXn8dVpw5wOJSDLCg/jdrfdfeRyCcu2HQ5TRCbSWYIwppPKT9ahbX0kjzBlVXXU1re9mK+2vomyKpvtZLwsQRjTCR6PMu/XK7n/te6zXXpGSjwJcW2PlSTEuclIiQ9TRCbSWYIwphN2HD5Bxal6zh2S6nQoAZs/IbPdSq8ejzJ/YmaYIjKRzhKEMZ2QX+Qt7z1rZHjLe3dFalIsC+dkk9jKjKvEWDcL52STmhgb5shMpLJ1EMZ0Qn5RGWMHptC/d4LToXTIormjAVi8svT0OohYt4smj3LrzKzTzxsDliCM6bCa+iY27D3G1/OynA6lw0SEe+aNYcGsbJYVHqasqo6MlHjmT8y0loM5iyUIYzpIBH59/Xnk9E92OpROS02K5YYzpueuKT3KBx8d49sXjXQoKhNpLEEY00EJsW6uODf6BnJX7PiEJ9/fQ15OGpOHRW7pEBM+NkhtTAe9sH4fe8pPOR1G0H3v0lH0T4nn3/9WaFuWGsAShFW1NB3yyYlafvDiNt7e/rHToQRdSkIs/3HlOLYfOsEzaz5yOhwTAXpsF5Oq8vCK3Z+ZzWFVLU17Crrh9NaOuGJiJi+M2s9/vb2L+RMzbdFcDxfSFoSIPCkiR0SksMWxn4jIVhHZLCLLRWRQK6/9uogU+R5fD3ZsD6/YzZL8PVbV0nRIflEZaclxjMvs7XQoISEi3H/VeBbNG03fJJvV1NOFuotpKXDZGcceVNVzVfU84HXgR2e+SET6AT8GLgCmAT8WkaCNmlVWN7B4ZSk1Df7r0lhVS+OPx6MUFB9l5sh0XFG8fWd2Ri++MXMEMW5Xt6o1ZYIvpAlCVVcCFWccO9Hix2TA3//AzwMrVLVCVY8BKzg70XTassLD7f6CW1VLc6Z9FdUcr65n9qjo7F4601uFH/PVxWuob/Q4HYpxiCOD1CLynyKyH7gRPy0IYDCwv8XPB3zH/F1roYhsEJENZWVlAd3fqlqazhienszmH8+Lyimu/sS6hbV7KniiYI/ToRiHOJIgVPXfVHUo8CxwVxevtVhVc1U1NyMjsH2Brapl5/X0WV+94mNIiusZczsuOWcAc8cN4JF3ijh4vMbpcIwDnJ7m+izwZT/HDwJDW/w8xHcsKKyqZcepKg8t38W0n/2dB17fwa9X7OaB13cw7Wd/56Hlu6K+r7q2oYmvPb6GlbsDa6VGix9/YRyK8sBr250OxTgg7AlCREa1+PFqYKef094G5olIX9/g9DzfsaCwqpYd19NnfW3Ye4xVJUd73AKyIX2T+O4lo3h7+yds3n/c6XBMmIW0rSwizwOfA9JF5ADemUnzRWQM4AE+Ar7pOzcX+KaqLlDVChH5CbDed6kHVLXirBt0wWeqWopQ09CE2yXEuIQFs0dYVcsWmmd91bUyWNk862vB7OhNqvlFZcS6hQuy+zkdStgtmJXN+EGpnDe0j9OhmDBrN0GIyADgZ8AgVb1cRMYBM1T1ifZeq6o3+Dns93WqugFY0OLnJ4En27tHZ51Z1fKpVXtJinPzv9+YFrVvcp3VkVlfZxaAixb5ReWcn9W3x4w/tBQX4+LC0d7xvaraBlIS7Pejpwiki2kp3u6d5gVtu4HvhSqgcGuuavnm3bN56f/NtOTgR0+f9VVWVceOwyeYPSqwSRDR6q3Cj8n7+f9FZR0q418gCSJdVf+Mt0sIVW0E2n636Iaay2q0N3jdE/X0WV+VNQ3MHpV++lN0TzVlmLeL6UevFEb9pATjFUiCOCUiafgWtInIdKAypFE5ZMFT6/nnv2xxOoyI09NnfY3s34s/3n4BEwZ3n/2nQ6F/7wTumTea/KJylm2LvmKF5myBJIhFwKtAjoi8DzwNfCekUTkkOT6G/OJy+3R0hp4860tVOXaq3ukwIsZN07MYP6g3P3l9ByfrGp0Ox4RYuwlCVTcCFwJ5wJ3AeFXdGurAnDAjO42yqjpKyk46HUrEWTR3NN+YORyAGJfQPGTtEqJ61lfRkZNM+ekK3iq0sisAMW4XP71mAuUn63i/uNzpcEyIBTKL6dvAs6q63fdzXxG5QVX/EPLowiwvx1tjZ1XJUUb2T3E4msgiInz/srEsnJPNa1sOcay6gXV7jrKq5ChfnTYsakuj5xeVowoTh9gUz2aTh/Wl4AcXMzA1welQTIgF0sV0h6qeXiHjK553R+hCcs7QfokM7pPIquKjTocSsfokxXHzjOF895JR/PIrkxARlr4fvbV68ovKyM5IZnCfRKdDiSjNyWHbgUrrko1igSQIt7T4eCgibiAudCE5R0RYOCebi8f2dzqUiHT9Y6s/U7htcJ9ErpiYycubDtLQFH0VP+sam1hTepTZUbo5UFetKT3KF/67gBc3Bq0Kjokwgaz6eQt4QUQe8/18p+9YVPp63nCnQ4hIB45Vs3ZPBfPGD/zM8R9cPpaEGBexbqfLegXfBx8do7bB0+PXP7Rm2vB+TBnWh58v+5BLz+lPn6So/NzYowXyW/0D4F3gW77HO8D3QxmU046cqKX4iA1Ut9S81eaZeyEM7pNIWi/v+odo62oYmdGLB64ez/ScNKdDiUgul/DTayZyrLqeB9/e5XQ4JgQCmcXkUdVHVfUrvsdjqhp1C+VauuHxNfz0jR1OhxFRCorL6Z8Sz6j+vc56rvxkHV/6w/u8svmQA5GFTv/eCdwyYzi94nteeY1AjRvUm1vzRvDcun1ssWJ+UafdBCEiM0VkhYjsFpFSEdkjIqXhCM4peTnprNtTEZX96p3h8SirSo4ya2S639lK/ZLiqKptZPHK0qhpRRyvrufFDw5wvNrWQLTnn+aOYkR6MvuPVTsdigmyQLqYngAeBmYBU4Fc39eolZeTRnV9E1sP2CcigOqGJq6YmNnqSmmXS7hjdjY7Dp9gVUl0zABbWVTOPX/ZYnWHApCSEMuKf7qQK88d1P7JplsJJEFUquqbqnpEVY82P0IemYOmZ3v7nG26q1ev+Bh+cs0ELh03oNVzrp48iPRe8SxeGR2Ny4KiMnonxHCurX8IiNslqCovbzoQtUUbe6JAEsS7IvKgiMwQkSnNj5BH5qC+yXGMy+wdNZ+Gu6q07GS7G+XEx7i5NS+L93aXsevjqjBFFhqqSkFROTNHpuNup8y5+dSBYzV8/69b+fmyD50OxQRJIKNvF/i+5rY4psDFwQ8ncvzsSxNJS7Zpe7UNTVz223xumzmCey8f2+a5N16QRWpiLMP6JYUputAoKTvFocpa7rrYprd2xNB+Sdw5J4f/freY66YOPd0SN91XuwlCVS8KRyCRxnbP8lq/t4L6Rk9AO6n1Tfausu7uNu07Bpw9pde079sXjeTlTQf5j78Vsuzu2VG5PqYnCWj+nohcAYwHThdfUdUHQhVUpHhh/T6S42N69OBbQVG5d6vNEYFvtfn8un3UNTRx68wRIYwsdK7NHcqsUelkplp5jY5KjHNz/1XjWfD0Bp4s2MOdF+Y4HZLpgkCmuf4PcD3eEt8CXAtkhTiuiPCn9fv53/f3Oh2GowqKy5kyrGNbba7cXcbDK3ZzqhuXg7bk0HmXjhvATdOHMdLPmhnTvQTS/stT1VuAY6p6PzADiM7azmfIy0ljy/7jPbbu/dGTdWw/dKLDXS13zMnmRG0jf96wP0SRhc7Gfcf41jMfcMDm9HfJT6+ZyCXntD7rzXQPgSSIGt/XahEZBDQA0bl12BnyctJp9Cjr91Q4HYojeiXE8PRt07j6vMEdet2UYX3JzerLk+/vobGbLTZ8d+cRlu/4hN5RuPlRuNU1NvHbvxfx3u4yp0MxnRRIgnhdRPoADwIbgb3A86EMKlKcn9WXOLeLVSU9c2OU+Bg3c0ZnMLQTs5LumJPN/ooa3t7+SQgiC52VReWcN7QPvRMsQXSVILy6xTtgXdsQ1dV5olYgCeJXqnpcVV/EO/YwFvhpaMOKDAmxbs7P6svHJ3rewh9V5dF/lHR6TcOl5wzginMz6ZPUfd5oK6sb2HbgOLOsvHdQxMW4+MnVE9hXUc2j/yhxOhzTCYGMPK4GpgCoah1QJyIbm49Fu6dum0ZcTM+bqren/BS/fGsnKQkxjBnY8d313C7h91/rXv9FVpWU41GYM9oSRLDkjUznqkmDePS9Er44eTDD05OdDsl0QKvvfCIyUETOBxJFZHKLVdSfA7r3SqgO6InJAbyzl6DrawEqTtXzyubusaGMCEwd3pdJVl4jqP79inOIc7u4/7XtTodiOqitFsTngVuBIcBDcHqf+irgX0MbVmS567mNDOmb1O5K4mhSUFTOkL6JXV4VvXTVXh55p4gJg1PJyYjsaY+XTcjksgk9Yv5FWPXvncCvvnJut19h3xO1+vFYVZ/yraK+VVUvVtWLfI+rVPWlMMbouJN1jfz9w+412NoVjU0eVpccZfYo/+W9O+Lm6VnExbg+s1VpJKqpb6K+sXvNuOpO5k/MZMLgVCD6NpaKZoH0nwwRkd7itURENorIvJBHFkHyctIoPnKSIydqnQ4lLPYercajyqyRXa9FlJESz5enDObFDw5w9GTkDvb/deMBJt2/vMf8GzvB41G+/9ct/OLNnU6HYgIUSIK4TVVPAPOANOBm4BchjSrC5OV4++FXl/aM6q4j+/di04/mMbeN8t4dcfusbOoaPfxxzUdBuV4o5O8uI61XHBkp8U6HErVcLsElwpKCPd2+4m9PEUiCaO5jmA88rarbWxxr/UUiT4rIEREpbHHsQRHZKSJbReRl3/oKf6/dKyLbRGSziGwI5A8SSudk9iY1MbZH7Q8RF+MK2gD9yP69uPScARw8VtP+yQ74tEsto8tdaqZtP7hsLL0TYviPvxVaV1M3EMg7wAcishxvgnhbRFKAQDprlwKXnXFsBTBBVc8FdgM/bOP1F6nqeaqa28Y5YeF2CTdPz2JsZsene3Y3J+saufJ3+by780hQr/voTVN48NpJQb1msGw5cJyqukar3hoGfZPj+MFlY1m3t4KXNnaP2W09WSAJ4nbgXmCqqlYDccA32nuRqq4EKs44tlxVmwsbrcE7Q6pb+OfPj+Eb3bQ6aUesLT1K4cETQZ/e21z2eX9FNZ52Nh8Kt5W7y3GJd6zJhN51uUOZPKwPv32nqN2NqIyzWp3mKiJjVXUncJ7vUHaQm9+3AS+08pwCy0VEgcdUdXEbcS4EFgIMGzYsmPGdpaa+iaraBvr3Tmj/5G4qv6ic+BgX52f1Dfq11++t4PrHVvPYzblBG98IhnnjB5CREk+fJNsgKhxcLuGhayeRFBdjO/ZFuLbWQSzC+8b7kJ/nurSjnIj8G9AIPNvKKbNU9aCI9AdWiMhOX4vk7EC8yWMxQG5ubsg+jqgqlz78HlOH9+U3X50cqts4rqC4nGkj+pEQ6w76tScP7UNmaiKPryyNqAQxflAq4welOh1Gj5LtWxOjqhyvbqCv7d4YkdpaB7HQ9/UiP4+uJIdbgSuBG7WVUSpVPej7egR4GZjW2fsFi4hwflZfVpUcjdrBtY8rayk+cjJkffExbhe3zRrBur0Vp3dtc9qHh0/w7q4jNHSzqrPR4u4/beaWJ9dZV1OEarOjWUTSROQ7IvJ73+MuEQl8a7Gzr3cZ8H3gKt94hr9zkn0D4YhIMt7ptYX+zg23vJw0jlTVUVJ2yulQQqK6vpH5Ewdy4ej+IbvH9VOHkpIQw5L8yFg49+zaj7jr2Y1Eac6PeJec059tByt5bt0+p0MxfrRVi+kcvG/M5+OdcVQETAUKRaTdmhMi8jzeQn9jROSAiNwO/DeQgrfbaLNvtzpEZJCILPO9dABQICJbgHXAG6r6Vqf/hEF0ej1ElJb/zs7oxR9uPL9TxfkC1Ss+hhsvyOKdnZ9wvLo+ZPcJVH5ROdOz03pszS2nXTVpEDOy03jwrZ2UR/BCyp5KWusuEZG/An9W1T+fcfzLwNdU9cthiK9DcnNzdcOG0C2bUFVm/fJdJg5O5X9uPj9k93GCqnLweA1D+oa+Xk7FqXoamzyOD/bvO1rNnAff5b4vjOu2+2dHg+IjVVz+23yumjSYh66LzKnQ0UxEPmhtOUFbg9QTVfUrZx5U1RdF5GdBi64bERF+es2EqFxtu+uTKi77TT6/u2EyX5g0KKT36tdiQNLjUVwOzWTJL/budDZ7dNdLipjOG9k/hTtmZ/PK5kMcOFZNflE5ZVV1ZKTEM39CJqkRsKdIZXUDywoPR1xcodZWgmiroz06O+EDcNHY0PXPO6mgyNttForprf7UNjRxy5PruHB0Bt++aGRY7nmmDz46xqDUBLJtjwLH3XXRSJo8yiUPvYfLJdTWN5EQ5+a+V7ezcE42i+aOdmSVu6ry8IrdLF5ZGlFxhUtbCaK/iCzyc1yAHvuRS1V5e/sn9E6IIS+Kdh4rKC4nOyOZQX0Sw3K/hFg38TEulq7ay4LZI4iPCf602vb811cm8fGJ2qj+Be8uHn2vhKdXf0Rdi4q6NfXebUqbJzTcM29M2ON6eMVuluTvibi4moW6ZdPWyNzjeAeUz3z0ApYELYJuRkT41ds7WRLh5as7oq6xibWlFcwOc8JbOCebsqo6Xt18KKz3beZySdgSomldZXUDi1eWUtPKvtU1DU0sXllKZU2DxeWjqjy0fBfTfvZ3Hnh9B79esZsHXt/BtJ/9nYeW7wraVPxWWxCqen9Q7hCF8nLSeHnjQRqaPKdLSHRnm/Ydp6ahiZlhThCzRqYzdmAKj+eX8pXzh4T1k/yzaz9i5+Eq7r9qvGNjIMZrWeHhdv8NXC7hobd38X5JOQqg4FFFgcdvyWX0gBRe3nSA/3p7t/e4gqJ4FF76Vh5D+yXx9Oq9/HrFbjzqfYNVQBXe/efPkZESzyPvFPH7d4t9x5Umj/f1bWlo8vDG1kN87YIsVuz4hOIjJ0lNjKV3YgypibH0SYxj4pBP98EI1v/xcLVsAtmT2pwhLyedZ9bsY9vBSqYMC0+ffSiNHZjCr6+fxIww1yISEe6Ync09f9nCe7vL+NyY8I3vvLLpEDUNTZYcIkBZVR219f4/pTerrW+ittHD2IG9QcAlguDdJjbRt+p/QO8EZuSknT7uEkGE01UBstN78YVJg3zPe58ThIRY74e884b24da84aef+2BvBev2tr2g06NQftI7XfvNbYd5adNnCxD2TYpl04+82+d8+7mNrNxdTu+EGHonxtI7MZbs9GR+8eVzAXhl80EqTtV7E0xCLKlJsaT3imfEGWNkzS2bulY2uGpu2SyYnU1qYte6myxBdML0bO8b6ari8qhIEH2S4vjiZGfqJn5h0iCq6xvJHd7p9ZcddrKukY37jrFwTnbY7mlal5EST0Kc+/QnYH8S4txMHtaHG6a1Xm8tLyf99Folf2aNSmdWG1UC5ozOYE6LGW3Pr9vHtkMn2owrMc59elbjQ9dN4qdfnMCJmkYqaxo4UdvwmV0KLz1nAAN7J1JZ03D6+ePVn3ZPPbVqLxv3Hf/M9ScNSeWVu2YB8MU/vM/+Cu/64vZW/rtcwrJth9v8+wqEJYhO6JccxzmZvdl+6ITToXRZZXUDL286wPxzM+mfEv51CXExLm6eMTys91xTcpRGj7b5ZmHCZ/6ETO57dXub53g8yvyJ4d0vvKNxiQhJcTEkxcUwMPXs36UvTRnCl6a0fq0/3zmDqtrGzySQll3Yl40fyEcV1WzYW3G61dKa2vomyqq6vvCw3QTh29TnFmB4y/NV9btdvns39tyCC+gTBfOgV5WUc99rO5gwONWRBNHslc0HKTlykkVhmBGSX1RGYqw7bFN6TdtSk2JZOCebJfl7/A4IJ8a6WTB7RJe7SyI9rhi3i77Jca0WLrzzwhzA27J54PUd7ba4grFeK5AR1mV4k8M24IMWjx6tb3JcVEyPzC8up1d8DJOG+t3cL2y2HqjkD/8o4XBl6Hed650YyxcmZToytdb4t2juaN90ZxeJcW4Eb/dNfIyLBbNHsGjuaIvLZ/6EzHb3VAlWi6vVUhunTxDZqKptNIwiR6hLbbSkqtz74jZGD0zh9lndt0zDhQ++y6j+vVjy9amOxnHgWDUXPvgPFswawQ/nn+NoLMY5Z83rn5gZ9pZDd4jroeW72m3ZBDqLqbOlNpr9UUTuAF4HTndqqWpF6y+JfiLCrk+qKC472W0TxP6Kaj46Ws038oY7HQpD+iYxf2Imz63dx10XjyQlITS/fCfrGkmOc0dF6y8apSbFdnlgNRQiLa7mlsuZK7w9Hg1qyyaQBFEPPAj8G96NgvB97fFTQGaOTOOx90o5WddIr/juN95feLASlxAxg7V3zB7Ba1sO8fjw+SEAABr4SURBVML6/SyYHZr/Xj94cSsHKqpPzwwxpjsSEe6ZN4YFs7JD2rIJ5F3tHmCkqkZnjesuyMtJ5/fvlrB+bwUXhXEOf7BcPjGTTf8xj96JkZHczh3Sh5unZzE8LTS1kZo8yvvF5VwyNnJ2szOmK0LdsgnknaEY8Lu5T093flZf4twuVpcc7ZYJAoi4ipQ/uWZCyK69/VAlx6sbQrZjnjHRJpBZTKeAzSLymIg80vwIdWDdQUKsmy9MGtQtp7sWHqzkpiVrKfqkyulQzlJZ3cDz6/YFfWvXfF/F2nCXFDGmuwqkBfE338P40V03OFlZVEZBcTl9kiJvs/g3Cw/zw5e2kZWW1ObK2I7KLyrjnMzeUbmfhzGh0G6CUNWnwhFId+bxKNUNTd1qoLqgqJyxA1Mi8s3ymsmD+a/lu3h8ZWlQE8SCWdk0etouUWCM+VS7XUwiskdESs98hCO47sDjUWb/6l0efGun06EErKa+iQ17j0VsX3xCrJtbZgzn3V1l7A5iF9il4wZw2YTwlmswpjsLZAwiF5jqe8wGHgGeCWVQ3YnLJeT078WqkqNOhxKwdXsrqG/yRHRf/E3Ts0iIdbEkPzifRQqKyik8WBmUaxnTU7SbIFT1aIvHQVX9DXBFGGLrNvJy0ig6cpIjVbVOhxKQGJcwc2QaF4wIb3nvjuiXHMe15w+l4lR9u2UFAnH/a9v5ZTdq5RkTCQIp1teyzIYLb4ui+3S2h0Gebx+F1SVHufq8wQ5H076ZI9MjuvXQ7L6rxuMOwn4NhytrKDpykmtznSlpbkx3Fcgb/UMtvm8E9gLXhSSabmr8oFR6J8R0iwRRU99Eo8cTslIWwdScHA4cq6ZfchxJcZ37XFLgm946e1SP3UrdmE4JpIvpohaPuap6h6ruCkdw3YXbJfz7leO4ZnJkJweA5Ts+5rwHVkTk+gd/9pSf4sIH/8FfNhzo9DXyi8pJ7xXP2IEpQYzMmOhn+0EEyXW5Q50OISAFRd7y3tkZvZwOJSAj0pOZNCSVJQWl3DQ9q8NdTqrKhr0VzB6VbgX6jOkg2w8iSDwe7xtRJM+UUVUKisuZOTItKH374bJwTjb7K2p4e/vHHX6tiPD3ey7k3svHhiAyY6JbIJ26Caq6KOSRdHMi8M1nPmDWyHR+89XJTofjV0nZKQ5X1vKdkd2rL37uuIFkpSWxeGUpl08Y2OGWQPM2kMaYjgmkBfFHEblDRDJFpF/zI+SRdTMiwoycdFaVHA16DaFgeb+4ebA28mcwteR2CbfPGkHhwUr2Hu1Y3cgHXtvBc2v3hSgyY6JbIAmieT+I1XzavdTutm0i8qSIHBGRwhbHHhSRnSKyVURe9o1v+HvtZSKyS0SKReTewP4ozsvLSeNIVR0lZaecDsWvi8b05z+/OIGh/ZKcDqXDrj1/KPk/uIgR6YGXAq+pb+KZtR9RWnYyhJEZE70CSRDN+0EMV9URvkcgu7ksBS4749gKYIKqngvsBn545otExA38HrgcGAfcICLjArif4z5dDxGZW2cMS0vixguynA6jUxLj3GSmJgLQ2BRYPaV1eyuob/REzIZIxnQ3gSSITu0HoaorgYozji1X1Ubfj2sAfyuXpgHFqlqqqvXAn4CrO3p/Jwzrl8TgPoms3RN5u7GWlJ3k1S2HqKk/ew/b7kJVuW3peu57bXtA5xcUlRHndkX0inFjIpmT+0HcBrzp5/hgYH+Lnw/4jvklIgtFZIOIbCgrKwtCWJ0nIjyz4IKILAH+6uZD3P2nTdQ1dt8EISJk9IrnLxsOcPRkXbvn5xeVkzu8L4lx7jBEZ0z0CSRB/A34T2AVQZrmKiL/hndV9rNduQ6Aqi5W1VxVzc3IcH52zoj0ZOJjIu8N6f3ics4dnBqR+z90xILZI6hr9PDMmrYHnusbPQzqk8jccba9qDGdFfb9IETkVuBK4BL1P93nINBy1dkQ37FuobHJw4Nv72LcoN4RU3ajqraBTfuP880LAxk6imyjBqRw8dj+PL16L3demE1CrP9kHBfj4slbp4Y3OGOiTKstCBH5s+/rNt+so888OnMzEbkM+D5wlaq2Nq6xHhglIiNEJA74KvBqZ+7nhBi3ixU7PuGVzYecDuW0NaUVNHm0WxToC8Qds7M5eqqelza2/rmhO4+1GBMp2mpB3O37emVnLiwizwOfA9JF5ADwY7yzluKBFb7FTmtU9ZsiMghYoqrzVbVRRO4C3gbcwJOqGtioZISYkZPG3zYdpKHJQ6w7kF680Np64DgJsS7Oz+rrdChBMT27H7/88kQun+h/8x9V5cIH3+WLUwbzw8vPCXN0xkSPVhOEqh72ff2oMxdW1Rv8HH6ilXMPAfNb/LwMb4mPbikvJ51n1+5j28FKpgxz/k150dzR3Dw9KyLHRjpDRLh+6rBWn9/5cRVHqurI6Sb1poyJVIFsOfolESkSkUoROSEiVSJyIhzBdVfTs70LzVdHyC5zIkL/3glOhxF0y7d/zL++vO2s45+W946OLjVjnBJI/8ev8I4ZpKpqb1VNUdXeoQ6sO0vrFc+M7DQaAlzQFUpvbD3Md5/fRFVtg9OhBN2+imqeW7uPLfuPf+b4yqIyRvbvdXphnTGmcwJJEJ+o6ochjyTKPL9wOt+7dLTTYfD29o9ZVXKUXvHRV6zu+qlDSYmP4fEW+1bXNjSxbk8Fs6JkQN4YJwXyrrFBRF7Aux7i9OokVX0pZFFFkSaPOlZa2+NR3i8uj9q9EFISYvnaBcN4PL+U/RXVDO2XhCr8+AvjmTDYGrnGdFUgCaI33lIb81ocU8ASRBsamzxc/tt8Lp8wkEXzxjgSw86Pqzh6qp5ZUbzV5q0zh/NEwR7+570SJgxOpayqjoyUeLL6BV7UzxjjXyAL5b4RjkCiTYzbRXJ8DKtKjuLUZhoFxd7SI9Hc3TKwdwJThvXhhfX7eWnTQWrqm0iIdXHfq9tZOCebRXNHR2XryZhwaDVBiMj3VfVXIvI7vC2Gz7AtR9uXl5PG4pWlnKprJNmBMYDk+BguPWcAA1OjbwZTs4dX7GbbwRM0epRG3+K42gbv5IAl+XsAuMehFpwx3V1bg9TNA9Mb+GwNJttyNEB5Oek0epT1e52p7nrjBVks+XquI/cOh8rqBhavLKWmwf+q6ZqGJhavLKWyJvpmcBkTDm0tlHvN9zWotZh6kvOz+hLrFlaXHOVzY/qH9d4n6xpJiHEREwEruUNlWeFhXO1MAHC5hGXbDnPDtNYX1hlj/Guri6nN+keqelXww4kuiXFu7r5kFOMGhX9GzR/eLeZP6/ez+ocXR80K6jOVVdVR207Npdr6Jsqq2i8Nbow5W1sd4zPw7svwPLAWsJG+Trjr4lGO3LeguJycjMgsPR4sGSnxJMS52yzMlxDnJiMlPoxRGRM92up/GAj8KzAB+C0wFyhX1fdU9b1wBBcNVJXSspPsO9rhTfk67diperYdrIya6q2tmT8hE4/HX8X4T3k8yvxWivoZY9rWaoJQ1SZVfUtVvw5Mx7v16D98lVZNgBqalCseKeCJgtL2Tw6SVSVHUY3+WkSpSbEsnJNNYit7QiTGulk4J5vUxNgwR2ZMdGhz7qWIxANXADcAw4FHgJdDH1b0iItxMXVEP1aFsXBfQXEZKfExTBrSJ2z3dMqiud5yJotXluJyCbX1TSTEufF4lAWzR5x+3hjTcW0NUj+Nt3tpGXC/qhaGLaook5eTxi/e3MmRqlr6p4R+TcJXzh9Kbla/qJ7B1ExEuGfeGBbMymZZ4eHTK6nnT8y0loMxXdRWC+Im4BTejYO+22I1qgBqFV0Dl5eTBnjLf4djG9Lzs/pGzeZAgUpNirWprMYEWVtjEC5fae8UX5nv3lbuu3PGD0olJSEmLPtDbNp3jFXF5fjf7tsYYwIXfTWgI5DbJSz9xlSy00O/w9nilaVs2X+c9++9OOT3MsZEN0sQYXJ+Vr+Q36PJo6wqOcrnxw+wAnXGmC6L/lHMCFHX2MRj75WQX1QWsntsO1hJZU1DVJf3NsaEjyWIMIlzu1i8spSXNh4M2T3eL/buxTzTNyhujDFdYQkiTESEGTlprCoJ3QDyhr0VjMvsTVovKy1hjOk6G4MIo7ycdF7fepjS8lPkZAR/wPrxW3I5YoXpjDFBYi2IMGpeDxGqVdUxbheD+iSG5NrGmJ7HEkQYZaUlkZWWxJETtUG/9pL8Un7x5s6gX9cY03NZF1MYiQjvLLowJCUw/vrBAdJ6xQX9usaYnstaEGEWiuRwpKqWnR9XMWukTW81xgSPJYgwq21o4tr/WcXS9/cE7ZrN01tnRfn+D8aY8LIEEWYJsW6OnqxnZVF50K5ZUHSUvkmxjHdga1NjTPQKWYIQkSdF5IiIFLY4dq2IbBcRj4jktvHavSKyTUQ2i8iGUMXolBk5aazbU0Fjkyco10tNjOWKczNxuay8hjEmeELZglgKXHbGsULgS8DKAF5/kaqep6qtJpLuKi8nnZN1jWw7WBmU6/3oC+P46TUTg3ItY4xpFrIEoaorgYozjn2oqrtCdc/uYnq2t3BfMNZDVNc3dvkaxhjjT6SOQSiwXEQ+EJGFbZ0oIgtFZIOIbCgrC10hvGBK6xXPTdOHMSI9ucvX+s5zm7hxyZogRGWMMZ8VqesgZqnqQRHpD6wQkZ2+FslZVHUxsBggNze32+ySE4wuoYYmD2tKj/LFKaHfpc4Y0/NEZAtCVQ/6vh4BXgamORtRaBw7Vc/Rk52vnbRp33FO1TfZ+gdjTEhEXIIQkWQRSWn+HpiHd3A7qpyqa2Tqf/6dp1bt7fQ1CorKcIl3VpQxxgRbKKe5Pg+sBsaIyAERuV1EvigiB4AZwBsi8rbv3EEissz30gFAgYhsAdYBb6jqW6GK0ynJ8TGMH5zapYHqguJyzh3Sh9TE2CBGZowxXiEbg1DVG1p56mU/5x4C5vu+LwUmhSquSJKXk8bjK0s5VddIcnzH/ylun5VNjNvWPhhjQiPiuph6krycNBo9yvq9Fe2f7McV52by+fEDgxyVMcZ4WYJwUG5WP2LdwupOdDOtKi5n9ydVIYjKGGO8InWaa4+QGOfmv782hXGZHa+h9O9/KyQrLYn//UZUTvAyxkQAa0E47PPjBzK0X1KHXnPweA2l5aeYadVbjTEhZAnCYbUNTfxlw362Hjge8GsKirwrxmePsvUPxpjQsQThMJcIP3plOy9tPBjwa/KLyumfEs/oAb1CGJkxpqezBOGwuBgXU0f0Y1VJYPtDqCpr91Qwa2Q6IjbF1RgTOjZIHQFmZKfxy7d2UlZVR0ZKfJvnigjv3HMhp+qsiqsxJrSsBREB8nylMlaXBjbdtXdCLJmpiaEMyRhjLEFEgvGDepOSEMOuj0+0e+7Pl33IC+v3hSEqY0xPZ11MESDG7aLgBxe3W1OptqGJpav2cuMFWWGKzBjTk1kLIkIEUnBvw95j1DV6mDXKqrcaY0LPEkSEOFHbwJ1/3MBrWw61ek5BcTmxbuGCEZYgjDGhZwkiQqTEx7Bh7zH+b+eRVs8pKC5j8rC+nar8aowxHWXvNBFCRJiRk8aqknJU9aw1Do1NHvomxTHLymsYY8LEEkQEyctJ5/WthyktP0VOxmdXSce4Xfzx9gsciswY0xNZF1MEaV4P4W+XubrGpnCHY4zp4SxBRJCstCQuHtufXvHuzxxXVS59+D1+/uaHDkVmjOmJrIspgogIT9469azje49Ws7+ihiF9O1YW3BhjusJaEBGorrGJ6vpPay2dLu9tA9TGmDCyBBFhjp2qZ9L9y3l+3f7TxwqKyxncJ5GsNGtBGGPCxxJEhOmbHEdmaiKrir3lvxubPKwqOcrsUVbe2xgTXjYGEYFm5KTx6uZDNDZ5aPQo98wdzfjBqU6HZYzpYawFEYHyctI4WdfItoOVJMS6uXXmCKYO7+d0WMaYHsZaEBFoerZ3PcSj/yihV0IMYwf25vrcoaQmtV/QzxhjgsUSRIRRVZ5atZcYl/De7jLqGj3EuA7x0PJdLJyTzaK5o20swhgTFpYgIszDK3azJH8PjR6l0aMAp79fkr8HgHvmjXEyRGNMD2FjEBGksrqBxStLqWnwX1ajpqGJxStLqaxpCHNkxpieKGQJQkSeFJEjIlLY4ti1IrJdRDwiktvGay8TkV0iUiwi94YqxkizrPAwLlfb3Ucul7Bs2+EwRWSM6clC2YJYClx2xrFC4EvAytZeJCJu4PfA5cA44AYRGReiGCNKWVUdtfVtF+WrrW+irKouTBEZY3qykCUIVV0JVJxx7ENV3dXOS6cBxapaqqr1wJ+Aq0MUZkTJSIknIc7d5jkJcW4yUuLDFJExpieLxDGIwcD+Fj8f8B3zS0QWisgGEdlQVlYW8uBCaf6ETDy+genWeDzK/ImZYYrIGNOTRWKC6BBVXayquaqam5GR4XQ4XZKaFMvCOdkkxvpvRSTGulk4J5vURFsPYYwJvUic5noQGNri5yG+Yz3CormjAVi8shSXS6itbyIhzo3HoyyYPeL088YYE2qRmCDWA6NEZATexPBV4GvOhhQ+IsI988awYFY2ywoPU1ZVR0ZKPPMnZlrLwRgTViFLECLyPPA5IF1EDgA/xjto/TsgA3hDRDar6udFZBCwRFXnq2qjiNwFvA24gSdVdXuo4oxUqUmx3DBtmNNhGGN6MFFte1C0O8nNzdUNGzY4HYYxxnQbIvKBqvpdl9btB6mNMcaEhiUIY4wxfkVVF5OIlAEfdfLl6UB5EMMJFourYyyujrG4OiYa48pSVb9rBKIqQXSFiGxorR/OSRZXx1hcHWNxdUxPi8u6mIwxxvhlCcIYY4xfliA+tdjpAFphcXWMxdUxFlfH9Ki4bAzCGGOMX9aCMMYY45clCGOMMX71+AThb2tUp4nIUBF5V0R2+LZovdvpmABEJEFE1onIFl9c9zsdU0si4haRTSLyutOxtCQie0Vkm4hsFpGIqQUjIn1E5K8islNEPhSRGREQ0xjf31Pz44SIfM/puABE5J98/+8LReR5EUlwOiYAEbnbF9P2YP9d9fgxCBGZA5wEnlbVCU7HAyAimUCmqm4UkRTgA+AaVd3hcFwCJKvqSRGJBQqAu1V1jZNxNRORRUAu0FtVr3Q6nmYishfIVdWIWmAlIk8B+aq6RETigCRVPe50XM182w8fBC5Q1c4ugA1WLIPx/n8fp6o1IvJnYJmqLnU4rgl4d92cBtQDbwHfVNXiYFy/x7cg/G2N6jRVPayqG33fVwEf0saueuGiXid9P8b6HhHxCUNEhgBXAEucjqU7EJFUYA7wBICq1kdScvC5BChxOjm0EAMkikgMkAQccjgegHOAtaparaqNwHvAl4J18R6fICKdiAwHJgNrnY3Ey9eNsxk4AqxQ1YiIC/gN8H3A43QgfiiwXEQ+EJGFTgfjMwIoA/7X1y23RESSnQ7qDF8Fnnc6CABVPQj8F7APOAxUqupyZ6MCoBCYLSJpIpIEzOezG651iSWICCYivYAXge+p6gmn4wFQ1SZVPQ/vTn/TfE1cR4nIlcARVf3A6VhaMUtVpwCXA9/2dWs6LQaYAjyqqpOBU8C9zob0KV+X11XAX5yOBUBE+gJX402sg4BkEbnJ2ahAVT8Efgksx9u9tBloCtb1LUFEKF8f/4vAs6r6ktPxnMnXHfEucJnTsQAzgat8ff1/Ai4WkWecDelTvk+fqOoR4GW8/cVOOwAcaNEC/CvehBEpLgc2quonTgficymwR1XLVLUBeAnIczgmAFT1CVU9X1XnAMeA3cG6tiWICOQbDH4C+FBVH3Y6nmYikiEifXzfJwJzgZ3ORgWq+kNVHaKqw/F2S/yfqjr+6Q5ARJJ9Ew3wdeHMw9st4ChV/RjYLyJjfIcuARydBHGGG4iQ7iWffcB0EUny/X5egnds0HEi0t/3dRje8YfngnXtSNyTOqz8bY2qqk84GxUzgZuBbb7+foB/VdVlDsYEkAk85Ztd4gL+rKoRNaU0Ag0AXva+pxADPKeqbzkb0mnfAZ71deeUAt9wOB7gdCKdC9zpdCzNVHWtiPwV2Ag0ApuInLIbL4pIGtAAfDuYkw16/DRXY4wx/lkXkzHGGL8sQRhjjPHLEoQxxhi/LEEYY4zxyxKEMcYYvyxBmKgmIj8XkYtE5BoR+WEHX5shImt9pShmn/HcP0QkojavF5HfNK/S9hefiEwUkaWOBGe6JUsQJtpdAKwBLgRWdvC1lwDbVHWyquYHPbIA+ArDBXJeGjDdV3zSL1XdBgzxLagypl2WIExUEpEHRWQrMBVYDSwAHhWRH/k5d7iI/J+IbBWRd0RkmIicB/wKuNq3L0FiAPccLiL5IrLR98jzHX9aRK5pcd6zInK1r/DhgyKy3nfvO33Pf853nVeBHb7V2G+Idx+OQhG53s/tv4y3Fk97XsO72tyYdlmCMFFJVf8FuB1YijdJbFXVc1X1AT+n/w54SlXPBZ4FHlHVzcCPgBdU9TxVrQngtkeAub7CfNcDj/iOPwHcCqfLbOcBb/jiq1TVqb4Y7xCREb7XTMG718ZovPWuDqnqJN+eJf4SwUy8+4a0ZwMwu92zjMEShIluU4AtwFjarpszg0/r1/wRmNXJ+8UCj4vINrxVSMcBqOp7wCgRycBbY+hFX+3+ecAtvnIqa4E0YJTvWutUdY/v+23AXBH5pYjMVtVKP/fOxFu+uz1H8FYjNaZdPb4Wk4k+vu6hpXhLkpfj3dxFfG/EMwJsDXTGPwGfAJPwfviqbfHc08BNeLt3mmseCfAdVX37jPg/h7f8NgCqultEpuCt9f9TEXnHT0uoBghkC8wE37nGtMtaECbqqOpm354Vu/F+iv8/4PNtdBWt4tN++RuBzg5IpwKHVdWDt9iiu8VzS4Hv+eJrrpr6NvAtX2l3RGS0v017RGQQUK2qzwAP4r8s94fAyABiHE0EVJM13YO1IExU8nXnHFNVj4iMbWc/7+/g3VntX/B20wRa1fQNEWnwfb8a+Fe8lTVvwTtO0LIV8ImIfAj8rcXrlwDDgY2+EtJlwDWcbSLwoIh48Fbs/Ja/WPBWP2255epn4lPVa4GLfOca0y6r5mpMGPi2g9wGTGllDCEY9ygArmyt3LOIxOPds3iWbwzEmDZZF5MxISYil+LtAvpdqJKDzz1AW2schgH3WnIwgbIWhDHGGL+sBWGMMcYvSxDGGGP8sgRhjDHGL0sQxhhj/LIEYYwxxq//D0NupS4FSfz5AAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    }
  ]
}
